Вы видите копию треда, сохраненную 19 декабря 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Мир твоему смартфону, анон. Прежде чем задавать свой вопрос, прочитай:
FAQ
> Хочу вкатиться в разработку под Android!
Большинство приложений написано на Java, выучить её на хорошем уровне — это первое, что необходимо сделать. Рекомендуемую литературу см. в Java-треде.
После этого можно открыть официальную документацию http://developer.android.com/training/index.html и попробовать создать по туториалам своё первое приложение.
В дальнейшем потребуется базовое знание SQL, понимание XML и JSON.
> IDE и инструменты?
Android Studio — основной инструмент разработчика. Кроме неё потребуется Android SDK (устанавливается вместе со студией).
> Мануалы?
- Официальная документация: http://developer.android.com/
- Полезный гайд для начинающих и продвинутых: http://guides.thecodepath.com/android
- Бесплатный видеокурс от Google для новичков: https://www.udacity.com/course/android-development-for-beginners--ud837
- Два ресурса, единственный плюс которых — русский язык: http://startandroid.ru/ и http://developer.alexanderklimov.ru/android/
- Классика, способная дать ответ на почти любой вопрос "Как сделать xyz?": http://stackoverflow.com/
> Не хочу писать на Java!
- Kotlin — JVM-совместимый язык от JetBrains. Есть лямбды, стримы и делегаты. Можно использовать в проекте вместе с кодом на Java.
> Есть что-то кроме нативных приложений?
- Xamarin — кросс-платформенный фреймворк на C#. Представляет из себя обёртку над Android API. Куплено Microsoft. Теперь есть бесплатная версия.
- PhoneGap/Ionic/Titanium/ReactNative — имя им javascript, принципы у них разные, первые три попытка в кроссплатформенность одного кода, ReactNative проповедует другой подход, а именно написание разного кода но на одном языке. Популярность у них разная как и размер комьюнити. Вопросы по ним — в js-тред.
- BugVM — кросс-платформенный фреймворк, написанный на Java. Форк невинно убиенного RoboVM.
> Хочу писать игры!
LibGDX или Unity. Спрашивать в /gd/
> Что нужно, чтобы взяли джуниором? Что учить в первую очередь?
Нужно хорошее знание Java, понимание базовых принципов Android (жизненный цикл activity/fragment, что такое Context, intents, services, UI thread, support library, shared preferences, SQLite), знание популярных библиотек типа Retrofit + Glide/Picasso. И хотя бы оно готовое приложение.
Предыдущий тред: https://2ch.hk/pr/res/856749.html (М)
Где норм цена заказать таких зеленых роботов?
Подари ему лучше пистолет.
>Сложные ли вообще андроид-спеки?
>чтобы не писать кучу патформо-зависимого кода?
Лентяя в тебе вижу я.
Твой petproject не взлетит.
Так мне для себя, хуле. Главное, чтобы мерзко от написания кода не было.
Будет. Альтернатива нет, мерзко будет от любой.
>>873559
pet project априори не может быть мерзким.
Он делается в своё удовольствие.
Так что бери и пиши на Java, как все.
Да меня просто спеки андроида немного напрягают. Насколько в лучшую сторону изменился андроид за последние года 3-4? Когда-то давно я ковырялся в нем, но блеванул и сбежал в ужасе.
Кстати, он будет на котлине, лел. Как и бэк. Охуенни язык.
Ебать, там через тернии надо нихуево пробиваться, чтобы стрим апи и java.util.function подключить. Теперь я точно на котлине писать буду, рофел.
>Кстати, он будет на котлине
Ай Молодца
Пиши свои DSL и extension methods что бы скрыть android-костыли
Кстати советую https://github.com/streamsupport/streamsupport для CompletableFuture.
Там есть еще Java Stream, но если он не нужен его можно спокойно вырезать в Proguard.
А мне норм. После одного проекта на скале дороги назад в ооп уже нет, лол.
> А что там насчет фич джавы 8? Все ли доступны?
Вообще ни одной. Некоторые синтаксические конструкции таки можно использовать вроде <>. Лямбды через retrolambda.
Не забывай, что на ведре 6 джава, поэтому я скорее не за 8 говорил, а за отличия от 6.
А зачем? Есть RetainedFragment, а childFragmentManager для суппорт фрагмента вызывается во всех актуальных апи.
В смысле? Предлагаешь делать каждый фрагмент (который View в MVP) делать setRetainedInstance(true) и в нем же и хранить презентер? А childFragmentManager тут причем?
>Observable для бедных
CF + async/await позволяет писать простой императивный код, который при этом будет асинхронным.
RX в неумелых руках будет городить вот такое >>867659
Ога, простой императивный. Который ни дебажить, ни тестировать нормально нельзя.
> в неумелых руках
Как будто CF + async/await в неумелых руках приведет к чему-то хорошему.
Ну, суть в том, что это совсем не тривиальная задача, сделать так, чтобы презентер жил ровно столько, сколько нужно, переживал изменение конфигурации и чтобы всей этой конструкцией было удобно пользоваться и можно было тестировать.
Предлагаю тебе хранить в каждом view (активити/фрагмент) внутренний фрагмент, с setretaininstance - и в нем хранить свои презентеры.
Что именно ты там собрался тестировать? Презентеры тестируются отдельно, view вроде тоже но я никогда не писал тестов для view
retain-фрагменты ведь не могут находится внутри других фрагментов, разве не так?
> view вроде тоже но я никогда не писал тестов для view
Отдельно тестировать View нет смысла. Нужно интеграционное (один экран) и системное (всё приложение) тестирование. Espresso, все дела.
>retain-фрагменты ведь не могут находится внутри других фрагментов, разве не так?
Эту хуйню пофиксили давно. Для этого и есть childFragmentManager().
>Который ни дебажить, ни тестировать нормально нельзя.
Единственное что легко отлаживать - это последовательный код.
У RX и CF есть свои проблемы, но они решаемы (в перспективе в IDEA можно будет даже степаться по коду).
>Как будто CF + async/await в неумелых руках приведет к чему-то хорошему.
На клиенской стороне это будет тот же последовательный код обернутый в await()
В RX начинается тот еще пиздец, когда цепочка не линейная и там есть условия/ветвления/циклы.
Вот пример преобразования "запроса картинки с кэшированием" из линейного в асинхронный.
Как видно, разница минимальная, а при этому во второй версии:
- requestImage вызывается в главном потоке и результат возвращается тоже
- все запросы к сети/диску исполняются в фоновых потоках
- getFromCache/putToCache работают в выделенном однопоточном пуле (для синхронного доступа к диску)
К примеру - скачивание файла и его обработка.
>красиво делаются асинхронные операции, соединенные в цепочку из двух
Зависит от библиотеки которую ты используешь.
Из коробке ни в JDK ни в Kotlin нет поддержки асинхронности.
at com.android.builder.png.AaptProcess.waitForReady(AaptProcess.java:108)
Гугл сказал увеличить SLAVE_AAPT_TIMEOUT, однако я не понимаю куда это прописать. Подскажите, пожалуйста
если тебе понравиться программировать то все само выучиться
если ты супер спец тебя с ушами заберут
гениям 4 года надо чтобы быть супер спецами
https://2ch.hk/makaba/posting.fcgi?task=post&board=pr&thread=873367&comment=test&captcha_type=2chaptcha&2chaptcha_id=[id]&2chaptcha_value=[value] (М)
, где [id] - многабукавицифр, а [value] - цифры с картинки капчи.
Писать ридонли-апликуху не хочу. Кто-то еще разрабатывал клиент двача?
1) Один плотный год, тратя честных часов 6 в день или полгода с сумасшедшим въебыванием и то если у тебя невероятные способности к обучению и почти эйдитическая память.
2) Фриланса почти нет, а так как у тебя нет опыта и топ аккаунта, то не существует.
3) От 25-30 тысяч рублей до 60 тысяч.
у меня фриланс случайно по ведру получился. Я писал под шиндоуз, но тут клиент сказал, а хочу на ведро тоже самое, в итоге познал ведро и сейчас делаю опенсоурсы всякие, с них донаты собираю.
У тебя есть и опыт и аккаунт, а у этого чувака нет этого. Как думаешь, будут ли пользоваться его услугами?
Самое-то, что именно на таких чуваках я зарабатывал раньше. Делают курсач какой-то и нихуя не могут, в итоге платят и я им делаю
пробовал добавлять старые SDK, нифига не помогло. На всякий случай пишу под Шиндоуз.
Палю годноту:
http://kovenant.komponents.nl
Тебе будет нужен kovenant-core и kovenant-android.
У меня диллема - забросить его (он неплохо работает, но код местами запутанный) или перепилить каждый кривой модуль в нём и уйти на левый иаркет, где пытаться продавать?
Приложение изначально делалось для себя и я им пользуюсь часто (через день)
> 2016
> вконтакте для воспроизведения музыки
Забей это бесперспективная тема, они и дальше будут ограничивать доступ к апи.
Даже РФ идет в строну Apple/Google Music (тем более там семейную подписку на 6 человек завезил).
А нет, ошибся. Только на ios есть.
Ты простой такой, как три рубля. Написал либу в три строки? Сорцы глянь, там куча всего. https://github.com/mplatvoet/kovenant
Ты прав в том, что для одной простейшей задачи либу подключать необязательно. С другой стороны, не знаю не помню, как красиво написать цепочку тасок стандартными средствами котлина.
Проблема в том, что в нём есть ссылка на вьюху она поворачивается и адаптер.
В адаптере тоже есть ссылка на вьюху точнее, на экземпляр интерфейса ItemClickListener, хранящийся во вьюхе.
Стоит ли городить велосипед с кучей WeakReference? Или же тупо убрать ссылку на ебаный адаптер в презентере, а во View тупо дублировать кучу методов адаптера?
> тупо убрать ссылку на ебаный адаптер в презентере, а во View тупо дублировать кучу методов адаптера
this
Опыт есть. Куда податься?
Пилю своё первое приложение https://www.youtube.com/watch?v=P-e6nTInYBE , хочу произвести впечатление на потенциального работодателя.
У приложения мало функций. В таких случаях делается ставка на дизайн и спецэффекты. Я не дизайнер. Шаблоны материального дизайна спасли ситуацию, но не во всех случаях экраны выглядят хорошо по умолчанию.
Как можно причесать стену текста? Есть какие-нибудь паттерны?
Обоссал либарасню.
Но есть один друг, который работает версталой и начал учить фронтенд, и он все подначивает меня, мол "го со мной во фронтенд, уже через месяц-два работу найдешь".
Как там у js-разработчиков обстоят дела в сравнении с андроид-разработчиками? Я почитал, вакансий раз в 5 больше, но все эти фреймворки учить + верстку, тот еще гемор, наверное. У кого был опыт и там и там, где интереснее?
Геморрой и там и тут. Говнобиблиотеки и говнофреймворки выучишь и там и тут, там их правда больше, верстка там удобней, а здесь куча костылей.
comScore недавно делали отчёт
в этом году мобильный траффик превысил десктопный.
Но это тренд в развитых странах, если ты работаешь не на белых господ, сам понимаешь. Влезай в mobile-first-веб-парашу, не проиграешь.
Прошу у вас помощи. Я установил Android SDK ещё когда устанавлиют Android Studio, потом решил писать на C# и скачал Xamarin. Создаю проект, а когда пробую компилировать, вылазит пикрилейтед. Как исправить? Что я делаю не так?
Пускай он сначала выучит фронтенд, и вкатится туда - а потом кукарекает. Любителей js сейчас овердохуя, в том числе full stack, с опытом похапе. А зп у верстал крайне низкие, и расти без переката во фронт они не будут.
Да и нужды в чистых фронтовиках не так много
Вопрос - как сделать, чтобы при запуске приложения первый айтем уже был выбран и подробности к нему показывались в правом фрагменте?
ListView.performItemClick() успешно симулирует эту функцию, но его почему-то нельзя вызывать из onLoadFinished()
Нужно декаплить листвью и фрагмент.
При выборе пункта меню, медиатор листвью высылает оповещение с id айтема. Медиатор фрагмента подписан на это оповещение, получает id, открывает соответствующую страницу. Медиатор листвью тоже будет подписан на него. При старте приложения посылаешь оповещение выбора айтема. Если айтем с id не выбран - выбрать.
Нахуя? Просто берешь и вешаешь в одном перенте после листвьюхи над ним раз так надо.
Так а какой родитель должен быть? Или какие атрибуты юзать? У меня родитель - листвью, и виджеты один за другим располагаться будут.
FrameLayout или RelativeLayout, или ConstraintLayout, вариантов много, но точно не линеар. Короче такой который позволяет располагать вьюхи друг над другом.
похоже на то
Благодарю
Ну я работаю. В легаси-проекте но довольно годном баги чиню, фичи пилю. Задавай свои ответы
inb4 не сосу, не делаю
При этом опять же - стоит повернуть экран или зайти в другую активити и вернуться кнопкой назад - сразу все корректно отображается.
Категорически не понимаю, в чем может быть причина - адаптер самый простой унаследованный от ArrayAdapter, данные в него загружаются простеньким лоадером в onLoadFinished() методе. Несколько раз так уже делал, но сравнение со своим прошлым кодом меня на решение не наводит.
Гугол не помог, надежда только на вас.
Адаптер используется в GridView, все что он делает - просто подгружает сеткой изображения по ссылкам через пикассо.
Хотя наверно через SmoothScroll в лисенере.
Как правильно реализовать?
В идеале хочу из базового приложения-фреймворка сделать в библиотеку, подключать её к финальным приложениям, наследовать активити и переопределять что нужно. Как такое сделать?
Сижу, епт, и развлекаюсь с Инь-Янь. Нужно соединение по синезубу сделать, сервер на питоне, клиент - на андроиде. БЛЯДЬ СУКА АНДРОИД ПОЧЕМУ СУКА БЛЯДЬ ЧУКА ХУЛЕ ТЫ ТАКОЙ КРИВОЙ БЛЯДЬ!!!
Все. Выговорился.
А вообще вопрос, как держать это сраное соединение открытым-то, а не переоткрывать заново каждый раз? Сервис что ли создать?
Конечно сервис, как еще епт.
>>876107
notifyDataSetChanged к сожалению не помог. Сейчас изменил GridView на ListView и все заработало как надо. Не могу даже представить, в чем тут дело.
Попробуй кастомный адаптер расширяющий BaseAdapter вместо хуйни под названием ArrayAdapter, а заодно RecyclerView проверь.
Не, так тоже не хочу - исходники приложения так не нужны ладе в виде подмодулей. Разве нельзя никак упаковать в зависимость которую градл разрулит?
Обычная эйчарская заглушка, игнорируй.
Скролл листенер
StorIO и так хватает
Гугл предлагает дичайшие костыли невероятных размеров, нет вариантов вернуть экшен бар по-приятнее?
Отослал резюме в фирму, прислали 2 теста, один по джаве, другой "Analytics Quiz"
Написали что есть встроенные алгоритмы детекта гуглопидоров и идеюзеров, поэтому ничего не использовать.
Что будет в аналитикс квизе? Можно к нему как-то подготовиться? Алсо, обязательно надо написать желаемую зп. 250$ норм? Украина, студент.
Ну я не хочу никого наебывать, я имел ввиду, мб кто знает что будет в тестах, мб есть подобные в интернетах и по них можно потренировать себя.
Ну повтори лайфцайклы, по верстке чето, курсоры и лоадеры. Погугли вдруг в интернете есть.
Довольно интересная хуйня, там были логические задачки аки из разных школьных олимпиадок, но были и совсем простые на логику для дебилов? типа:
2 велосепедиста выехали из одной точки в разные направления, проехали 9 км каждый, потом поехали назад на 12 км оба, какая между ними дистанция.
А из сложных:
Если до Х добавить Х, потом добавить 1/2 X, потом добавить 1/4 X и добавить еще 1 будет 100. Сколько равно Х
Расстояние: 3*sqrt(2-2cos(a)), где a - угол между изначальными траекториями велосипедистов).
Вакансию в интернете нашёл, или просто послал резюме в компанию наобум?
Какие вообще есть годные сайты с работой? А то я только на dou и work.ua бываю
Возился с темами, но безуспешно. В итоге сейчас стоит та же тема, что на главном активити. На главном активити есть экшен бар, на сеттингс нет. Гугл мне подсказывает, что может помочь использование PreferenceFragment вместо PreferenceActivity. Из-за мин апи 10 быстро я это сделать не смог, так что попробую завтра.
>>876940
Я нуфаг, учусь по курсам от гугл, они там предлагают для проекта по курсу использовать мин апи 10. Из-за этого я конечно уже знатно подазебался гуглить запросы вроде %хуйнянем% api 10. Но зато приложение работает на телефоне за 999р
Какой апи оптимально использовать для проектов в портфолио? 15?
Я не берусь за проекты, где minSdk меньше 16. Слишком много дополнительных затрат ради двух процентов пользователей. https://developer.android.com/about/dashboards/index.html
Для портфолио или пет-проектов уже можно на 19 перейти https://twitter.com/minSdkVersion
Сохранять статус проигрывания по-видимому в переменной. Или увеличить буфер чата, чтобы не перерисовывалось.
Создаю соединение, получаю данные, закрываю поток, закрываю соединение, повторяю. Через минуту-две приложение вылетает с fatal signal 11 (sigsegv), code 1, fault addr
В дебаггере видно, как по сотне-другой килобайт растет потребление памяти, доходит до лимита, после чего происходит ошибка и вылет. Утечка идет именно тут:
[code]
@Override
public void onCreate() {
super.onCreate();
try {
Thread thread = new Thread() {
@Override
public void run() {
try {
while (true) {
sleep(2000);
HttpURLConnection conn = null;
InputStream is = null;
try {
System.setProperty("http.keepAlive", "false");
URL url = new URL("http://example.com");
conn = (HttpURLConnection)url.openConnection();
is = new BufferedInputStream(conn.getInputStream());
is.close();
} catch (Exception ex) {
} finally {
if (conn != null) {
conn.disconnect();
}
}
}
}catch (Exception e) {
e.printStackTrace();
} finally {
}
}
};
thread.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
[/ code]
ЧЯДНТ? Почему андроид не освобождает память после выполнения запроса? Причем даже включено android:largeHeap="true", но оно не всегда успевает, и приложение падает.
При этом проблемы нет в 4 андроиде, но есть ярко выраженная в 6.
Создаю соединение, получаю данные, закрываю поток, закрываю соединение, повторяю. Через минуту-две приложение вылетает с fatal signal 11 (sigsegv), code 1, fault addr
В дебаггере видно, как по сотне-другой килобайт растет потребление памяти, доходит до лимита, после чего происходит ошибка и вылет. Утечка идет именно тут:
[code]
@Override
public void onCreate() {
super.onCreate();
try {
Thread thread = new Thread() {
@Override
public void run() {
try {
while (true) {
sleep(2000);
HttpURLConnection conn = null;
InputStream is = null;
try {
System.setProperty("http.keepAlive", "false");
URL url = new URL("http://example.com");
conn = (HttpURLConnection)url.openConnection();
is = new BufferedInputStream(conn.getInputStream());
is.close();
} catch (Exception ex) {
} finally {
if (conn != null) {
conn.disconnect();
}
}
}
}catch (Exception e) {
e.printStackTrace();
} finally {
}
}
};
thread.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
[/ code]
ЧЯДНТ? Почему андроид не освобождает память после выполнения запроса? Причем даже включено android:largeHeap="true", но оно не всегда успевает, и приложение падает.
При этом проблемы нет в 4 андроиде, но есть ярко выраженная в 6.
> у меня есть сервис в бэкграунде, который раз в 1 секунду делает запрос с сервера
Ну я даже не знаю, в чем может быть проблема.
Ну начнем с того что ты делаешь полную хуйню. Подключай LeakCanary и смотри кто именно жрет память. Подозреваю что неявная ссылка на сервис в треде это пиздос.
А как надо? Мне нужно в фоне раз в секунду отправлять данные и получать тоже, как еще это сделать?
Как написано в доках, цвет этот нельзя менять, он сам будет автоматом подстраиваться под цвет тулбара. Но понятное дело, что это полная залупа, у меня к примеру приложение в песочных тонах и с белыми кнопками на тулбарах везде, а тут сделал песочный тулбар и заголовок с кнопкой закрытия какого-то хуя коричневатый стал автоматом. В общем, не порядок.
Анончики, кто с подобным сталкивался, как побеждали? Может как-то через рефлексию достучаться можно до переменных с цетом табов? Было у кого такое? Няшу вам для привлечения внимания
Одно во вкладке браузера, другое - в самом таске приложения.
Это пиздец, сами понимаете. Причем в силу специфики api нельзя сделать то же самое через WebView ( сейчас через Intent-ы сделано ACTION_VIEW )
Чтоб ты в аду сгорел с этими custom tabs.
Хотя бы сделай настройку в своем приложении для отключения этой срани
Малой, чем они тебе так не угодили ? Они же явно выигрывают у вебвью и у интентов в браузер по всем параметрам.
разобрался, singleTask в манифесте спас. Теперь такой вопрос - api блочит oauth авторизацию из WebView ( можно только через браузер ), а браузер сохраняет кэш, соответственно в силу отсутствия функции logout в апи, перезайти через другой аккаунт из приложения пользователь не сможет. Есть ли какой-то workaround для обхода блока oauth из WebView внутри приложения ?
и не забудь проставлять referrer в обработчике shouldOverrideUrlLoading по умолчанию он не прокидывается
Если для тупых - что нужно в referer пихать ?
Скажем, идут последовательные редиректы при oauth и хуй знает когда закончатся, мне пихать постоянно изначальный url, с которого чейн начался, полностью ли или только BASE_URl, параметры - ?
Нет, я забил.
У меня такая же проблема, что цветовая схема светлая, и текст с кнопкой белые в приложении, а в хромтабах темные.
Как сделать так, чтобы после перезапуска работа приложения начиналась с "нулевой точки"?
Кроме этого у меня в шаредпрефс хранятся данные пользователя, но их я в процессе работы не меняю. Может, там проблема?
Смотрел, там примерно это:
A/libc(32140): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1)
Как из-под макоси это можно раскрыть?
Есть одна онлайн игрушка, я хочу смотреть её трафик, зареверсинжинирить протокол и написать бота для рутинных действий. Но опыта по разработки под ведро нет. Да и бота я под ведро делать не планирую. Мне нужен просто способ, как на ноуте с пердоликсом смотреть в прямом эфире трафик с приложения, типа wireshark. Можно, конечно, поднять точку на ноуте, подключить туда трубу и смотреть, это самое простое, но там скорее всего SSL и всё такое, так что нужно намутить полноценный MITM. Как это правильно сделать? Или в/для ведра есть инструменты что бы это просто сделать?
Просто я нашел, но не могу в силу криворукости воспроизвести на макоси, установил ports, к нему binutils, не могу запустить addr2line, чтобы расшифровать.
Библиотеки:
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
compile 'com.kyleduo.switchbutton:library:1.4.4'
compile 'com.googlecode.json-simple:json-simple:1.1'
compile 'org.apache.httpcomponents:httpcore:4.4.1'
compile 'org.apache.httpcomponents:httpclient:4.5'
>Current Linux build: 4.4.8.4 Built: June 13 2014
Похоже, не всё так просто. Но за наводку спасибо.
Не вижу какх-нибудь сильно хуевые завимостей, попробуй запустить с брейкпоинтами в onCreate приложухи и первой активити.
Пробую...
А как вообще происходит восстановление работы или повторный запуск после вылета?
Параметр android:launchMode может влиять?
Хз, обычно его трогать нет необходимости.
Я накатил Genymotion и Charles Proxy. Установил сертификат и всё такое. Вижу SSL трафик и его содержимое, но не вижу трафика приложения. Генерируется трафик Google API когда я логинюсь в игре, с моими учетными данными и токенами для игры, но трафика игры нет. Значит ли это, что там какой-то свой, не http-трафик или приложение на упаковало его в прокси, или что?
По идеи через SOCKS можно гонять весь TCP трафик, так вот, как завернуть всю виртуалку в него? Ибо в настройках псевдовайфая можно только указать обычный прокс и написано, мол, не гарантируется, что приложения будут его использовать.
А если там сертификат пининг?
Отмена. Powersafe mode включен был оказывается.
Так и не понял, в андроид SOCKS не завезли? Поставил ProxyDroid. Рут есть. Он то не заворачивает трафик, то заворачивает, но не пускает в прокси, хотя пишет что соединение установлено. Ни SOCKS, ни обычный. Так как заставить андроид использовать прокси?
Только что проверил Wireshark ом: ProxyDroid вообще не пытается даже делать соединение с указанным IP. Попробовал Shadowsocks - он соединяется, но в подконтрольных приложениях просто отваливается интернет. Пойду в /mobi/, наверное.
Очень сильно изменился. Когда я запрыгнул в его вагон, одним из первых, в ужасе съебался через гальюн. Потом пробовал ещё раз.
Наконец попробовал на днях. Просто сел и написал своё приложение. Первое открытие - Java это примитивная форма C#. Я целыми функциями копировал код без изменений. Результат - свою первую прогу сейчас тестирую в маркете. Android Studio, конечно, до сих пор не дотягивает до Visual Studio, но к нему можно привыкнуть и воспринимать его не как нечто худшее (потому что некоторые фишки там даже лучше), а просто как несколько иную среду. Принципы, как и в языках, остались прежними.
> Java это примитивная форма C#
> Android Studio, конечно, до сих пор не дотягивает до Visual Studio
Ох лол. Анальные рабы мелкософта озвучивают своё очень важное мнение.
Так то java вообще не нужна,
а VS дотягивает до IDEA CE только в комплекте с платным решарпером.
16 минимум должно быть.
К примеру, фрагмент со списочком и выбором одного элемента X должен быть в одной из табов.
Но в то же время в другом месте кода, по клику на баттон должно открываться окно с такой же функциональностью, и запиливаться в Backstack?
Делаете всё на фрагментах?
Делаешь хуйню фрагментом, и в одном месте пихаешь в пейджер, а в другом - в активити.
А бекендщики не умеют в постман?
Если я отправлю хуйню, отпишусь при помощи localbroadcast.unregisterReceiver() и потом чеез минуту заново подпишусь - получу ли я сообщение?
>Пожаловался полицаям на контору пиратов.
Зато не лезет качать обновления когда этого не надо.
> есть очередь сообщений
В некотором роде есть.
> потом чеез минуту заново подпишусь - получу ли я сообщение
Нет.
>>878771
> onCreate
>В некотором роде есть.
Ну... Это пока ситуацию не прояснило.
> onCreate
У меня наоборот получилось - сначала onStartCommand, а потом onCreate когда система убила сервис и перезапустила.
Я понимаю, почему ты спрашиваешь этот вопрос. Нет, если сервис кинет интент, твоя активность при пересоздании его не поймает. А очередь там только при отправке сообщений не на главном потоке, ибо они закидываются в handler, который на Looper.mainLooper.
> У меня наоборот получилось
> (creating it and calling its onCreate() method if needed) and then call its onStartCommand(Intent, int, int)
О! Теперь понял, спасибо.
Пришел к вам за советом - как наиболее эффективно подготовиться к собеседованию на junior или middle?
Что имею: год работы в частной конторе разнорабочим программером, писал на C++ Qt, C#, C и конечно же под android на java. Так получилось что имею 4 законченных приложения. Каждое по ~10 000...15 000 строк.
Цель - свалить в ДС на не менее, чем 100 тр./мес. Мелкая контора в которой я работаю разваливается - в течении пары месяцев нужно валить.
Каких советов дадите?
Никогда по собеседованиям уровня ДС не ходил.
Ну так смысла же нет иначе ехать в ДС.
На всяких сайтах типа hh.ru на мидла как правило от сотки. Джуны 80...90.
>имею 4 законченных приложения. Каждое по ~10 000...15 000 строк.
ты крутой, думаю достаточно будет их показать и тебя возмут на соточку
удачи, не парься особо
Приехал тебе за щеку.
где хранится фоновая картинка экрана блокировки андроида 5.0?
Да ладно, такого же не бывает.
Всегда собеседования с целью сбить планку до уровня дошираков, не?
Смотрю я еврогейские вакансии. Во многих требуется шива, которая может и нахуй сесть и рыбку сьесть сразу на двух платформах iOS и Android. Какого хуя? Я не конечно понимаю, что можно овладеть обеими платформами, но добиться совершенства можно задрачивая только одну.
Поясните же мне, почему они требуют сразу два скила?
Same shit в Канаде. Чаще всего в таких случаях требуют владения Xamarin, либо PhoneGap.
>запустил пустой шаблон Xamarin.Forms на физическом девайсе; 3 секунды, чтобы на экране что-нибудь появилось; на официальном форуме пишут, что проблема фундаментальная, нужно переписывать формс с нуля.
Есть Xamarin.Android/IOS, но в этом случае всё равно нужно знать архитектуру и принципы нативной платформы. Профит только от некоторых плюшек языка и общей логики.
PhoneGap подходит разве что для прототипирования.
Сейчас вот думаю, продолжать ковырять Xamarin/Haxe/Adobe AIR или оставаться в нативной.
Буквально 5 экранов https://dimous.github.io/rntr/ брат чуть не умер.
Скажу чтобы ты назад в b уёбывал, школьник.
Ммм, дарт, обмажусь как-нибудь
УБИЙЦА АНДРОЕДА
Как то у тебя там по скринам судя все люто черезчур, можешь исходники кинуть посмотреть ? Даже интересно стало, у меня тащемта такого треша нету, а приложеньки экранов на 15-20
А зачем лезть в кроссплатформу ? На вскидку проще уж заделаться стабильным мидлом и в стартапах за доли учавствовать, если уж не по Рашке имеете возможность работать, а в Гейропе/СПШ
Быстрофикс: мидлом по конкретной платформе
Этого хватит для джуна? Дроид подучил, SQL, Git. Рест много где надо. Вкачусь? Киев, если что.
Смотрю вакансии - много где надо. Не знаю с какой стороны к нему подойти.
>4 приложения
>каждое по 10000-15000 строк
Не завидуй, дно. Если у него это не сапёры/КРЕСТИКИ-НОЛИКИ ПА БЛЮТУС - оторвут с руками
> 10000-15000 строк кода
> приложения джуна
Ну это же JAVA
Я прям представляю что там за месиво и макароны.
А вообще количеством строк гордятся только Индусы.
<resources>
<style name="AppTheme" parent="@style/Theme.Leanback">
<item name="android:colorPrimary">#000000</item>
...
[/code]
Как сделать чтоб android:colorPrimary можно было переопределить для разных flavor'ов? Помимо styles.xml для каждого
shared-prefences / файлы с json или ObjectOutputStream
А вообще не еби мозгу, заюзай паттерн адаптер.
Сделай интерфейс типа Repository и конкретные реализации PreferencesRepository / FileRepository
я прикрутил эпло сервисы (геолокация по вафлям) в андроид приложение
насколько сильно меня выебет эпол, если я это пущу в продакшн?
Блютус? В чем суть?
<item name="android:colorPrimary">@color/colorPrimary</item>
Потом отдельный файлик с цветами называющийся например flavor_colors.xml в values для каждого переопределить.
ей б-гу, пока читал успел дважды отречься от MVP. Что же ты мутишь там такое лютое то, что все настолько весело ? И зачем сообщения из модели отправлять, ведь по факту она есть data layer, а потому данные берутся из нее плюс из нее предоставляются низкоуровневые интерфейсы для взаимодействия с кэшэм. То есть отправка сообщения вроде в presenter-layer должна происходить, ибо бизнес логика в презентере, не ?
Вышел обосрамс. Выполнил задание, проверил, собрал релиз, отправил, отказали без объяснения причин. Решил проверить этот apk.
>FATAL EXCEPTION: main
>Caused by: java.io.NotSerializableException: android.widget.ExpandableListView$SavedState
На дебаге не было прогарда. Сейчас перебираю правила:
>-keepclassmembers class implements android.os.Parcelable {;}
>-keepclassmembers class implements android.view.AbsSavedState {;}
>-keepclassmembers class implements android.view.View.BaseSavedState {;}
>-keepclassmembers class implements android.widget.$SavedState {*;}
Помогает только отключение прогарда. Ну поцчему!?
Мне казалось что презентер должен быть максимально легковесным, в отличии от контроллера в MVC, и бизнес логика не на его уровне происходит. Ну может я не правильно выразился, разумеется я не отправляю сообщение как Message msg = ...; msg.send()
А собираюсь делать что-то вроде:
btn_send -> click -> repository.sendMessage(msgData)
А дальше репозиторий сам разруливает что там за месадж - текстовый или картинка, а может и стикер, или не весть еще что. Ну и вроде как все не весело, просто нужно же как-то кешировать отправленные сообщения локально и показывать что до сервака еще не дошло. Разве это не должно происходить в слое модели? Что бы не трогая презентер можно было поменять способ кеширования и отправки. Чет у меня каша в голове, надо детальней прочитать кто, что и кому.
Кого ты там сериализуешь? Ты точно дефолтный прогвард андроидовский используешь?
состояние сохраняю в бандл
всё по дефолту AndroidStudio
>proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
да всё правильно, это вроде ещё называется VIPER (там типа класс Router, который работает с бд и сетью, а презентер дерагет его методы)
Хрень какая-т о у тебя, у меня везде:
>proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
Что-то мне подсказывает, что это не лучший выбор - как эффективнее поступить в таком случае?
вроде да, но он достаточно известен
бамп вопросу
>>880134
Всё верно, отправкой и получением данных должен заниматься слой данных (репозиторий или интерактор). Презентер должен лишь дергать соответствующий метод и не зависеть от конкретного источника данных.
Так что, я бы сделал примерно так, как ты описал: репозиторий будет вызывать сервис и передавать в него сообщение для отправки.
> лоадер отказывается запускаться второй раз
Что значит отказывается? Ты restartLoader() вызывал или что?
Наоборот же.
У тебя презентер создается для того, чтобы отделить бизнес логику от view. Смысл сего действа актуален, когда у тебя жирная логика по скрытию/показу элементов, загрузке/подгрузке, а также контролу за состоянием сего действа. С презентером ты можешь эту всю хуйню изолировать, и оттестить на jvm
Два чая.
Ну я так и хочу, но не хочу что бы презентер занимался ебалой с записью/удаленными запросами, как-то это не к лицу ему.
Нужно для доступа к Sheets API, Drive API и т.п.
Если нет документации - подключаешься к браслету, смотришь список характеристик, смотришь какие из них меняются. Далее догадываешься где там пульс.
$ gradle android:dependencies
FAILURE: Build failed with an exception.
* What went wrong:
A problem occurred configuring project ':android'.
> Could not resolve all dependencies for configuration ':android:_debugApkCopy'.
___> Could not find com.android.databinding:baseLibrary:2.2.2.
___Required by:
______project :android
___> Could not find com.android.databinding:baseLibrary:2.2.2.
___Required by:
______project :android > com.android.databinding:library:1.2.1
______project :android > com.android.databinding:adapters:1.2.1
Что не так и как пофиксить? Собирается все нормально.
AccountManager
>не рабочая вещица.
На говнофоне с android 3.0? Или ты у мамки забыл forceLoad вызвать?
>>880304
В том, что поворот экрана не прерывает загрузку.
Имхо:
1) джейк уортон
2) майк пенц
3) антонио секас
4) ромка нурик
5) лиза рей
6) антонио левиа
7) тёма зинатуллин
8) даня сердюков
Ноунейм-индусов из гугла в расчёт не берём
Чет Хейза куда-то впихни.
>Топ 10 андроид-разрабов
Звучит как "Топ 10 защкваренных девелоперов",
учитывая что Android это был кривой форк JVM,
состоящий из костылей чуть более чем полностью.
> На говнофоне с android 3.0? Или ты у мамки забыл forceLoad вызвать?
Везде не рабочая. Нет, не забыл.
Она работает, но работает так, что лучше бы не работала.
> В том, что поворот экрана не прерывает загрузку.
В том то и дело, что прерывает. Loader гарантирует хранение загруженных данных, но работающую фоновую задачу он перезапускает, если она не была завершена.
По крайней мере если использовать на фрагментах. На активити же вообще работает с откровенными багами, которые, возможно, уже исправили, но как минимум до 5.1 андроида включительно они были. Полтора года назад здесь об этом сокрушался, вряд ли свой пост уже найду, я уже и суть бага забыл.
Используй support library и не выёбывайся.
Нет, встроенный. Я в курсе, что саппортный всегда лучше, только код андроида вместо с саппортным тоже обновляется. То есть если с 4 по 5.1 (как минимум) вёдра были такие проблемы — я очень сомневаюсь, что в то время в саппортном не было тех же проблем. Сейчас, возможно, всё изменилось.
>Ты из какого треда к нам забежал?
Из "Java vs GO"
шутка, я тут с вами уже пару лет деградирую
Сам себе злой буратино, в саппортном хотя бы баги фиксят.
Марк Мёрфи ровный пацан
Ну, на том clojure можно с удобством под андроид писать, я думаю, так что не всё потеряно.
ну там какбэ что-то похожее на наполенние .smali файлов. Жуть низкоуровневая по большей части. К слову было бы занятно посмотреть, есть ли преимущества при разработке крупных проектов, где функционалка побольше преимуществ даст...
Ролл
Как получить месяц на 16 API level-то, блеать?
Он и не должен. Детали логики запроса - обязанность модели. Хотя тут всё зависит от задачи - может пользователю принципиально важно получать данные именно из источника X - тогда да, презентер может выбирать источник данных.
Алсо, мне одной проще писать презентеры через TDD?
Месяц надо получать через
https://developer.android.com/reference/java/util/GregorianCalendar.html
Statless presenter, он все поменяет только когда получит данные для отрисовки, по анбайнду от вью все данные зануляются, вообще согласен что не лучшее решение, но пока так.
У вложенных нужно проверять состояние всех родительских и будет все ок.
Хуй знает когда вызовется, если пользователь не смахнет пальцем может вообще не вызваться.
А ресурсы в том же лоадере не несвоевременно освобождаются? Он также будет держать ссылку на свой результат пока не закроется родительский компонент, иначе бы он терял результат на втором перевороте.
Mortar использует тот же подход. Mosby собирается перекатиться на него тоже со своих ретеин фрагментов.
> Он также будет держать ссылку на свой результат пока не закроется родительский компонент
Или явно не вызовешь destroyLoader.
Хуй соси, пидор.
> А @ActivityScope в даггере по такому принципу вообще не используется.
Расскажи подробнее. Ты в ручную как-то сообщаешь даггеру, что этот скоуп завершён, используя onDestroy и isFinishing?
> Не вызывается только в одном случае - если процесс полностью убивается. А если он убивается, то вообще уже похуй, ты ничего не сделаешь.
Насколько я помню, существует способ закрыть активити так, что у него onDestroy не вызовется и при этом процесс останется в памяти.
Через CLEAR_TOP это вроде делается, когда A порождает B, а из B с таким флагом запускаешь A, из-за чего B неявно удаляется. Но это было давно уже, я точно сам забыл, да и исправить уже могли.
Cyril Mottier.
Абсолютно.
Ведро - довольно молодая отрасль, многие разработчики даже про разделение логики/представления не слышали.
Но материалы по TDD для ведра всё же имеются.
Синьор-помидор. Пиши на фейкопочту ia.eDmhereforyouANUSbkpJMPUNCTUM0$ ru если хочешь.
1) Вызов X из сети
2) По поступившим данным - два параллельных запроса
3) Результаты двух запросов собираются в один
Всё это должно быть холодным, все запросы - Single. Есть-ли какой-то более нормальный способ, кроме
[code]
createRequestA()
.flatMap( -> {
return Single.zip(createRequestB(), createRequestC());
})
.[/code]
О, а не подскажешь: если есть опция кэширования в приложении, то модель должна быть ответственна за выбор источника, или презентер смотрит а-ля есть кэш - оттуда, нет - грузим в кэш ?
И чем тебя этот не устроил?
Хуй знает. Во всяких примерах кэш разруливается в модели. Но если у тебя пользователь может управлять кэшем - зависит от того, что конкретно он может с ним делать, и когда.
Если там хуйня в настройках типа "кэш вкл/выкл" - я бы делал всё в модели
Нет, для пользователя не должно быть видно разницы. Для пользователя должно быть видно лишь что все очень быстро работает.
В презенторе не должно быть ни какой логики, это просто смазка между конкретным UI и бизнес-логикой.
P.S.
Огромный минус MV(P/C/VM) что новички не понимают зачем нужна прослойка.
В итоге в сложном UI она просто превращается в костыль из спагетти под 1k строк,
куда скидывают весь непонятный код.
мимо
Ну вроде как аксиома Эскобара. Ибо либо модель жиреет и вью, а презентер тонкий, либо же презентер, а соответственно модель и вью потоньше. Разницы то по факту нет.
Single Responsibility Principle - твой друг
Сложный UI - сложные(кастомные) контролы
Сложная предметная область - сложная бизнес логика
imho Сложный Presenter это:
• нет времени обдумывать архитектуру - положи код в презентер
• не знаешь к какому слою относится код - положи в презентер
• не знаешь как сделать правильные зависимости - положи все зависимости в презентер
Это почти как когда все сували внутрь активити, только тебе в отдельный Java класс.
P.S.
Кстати императивные правила правильного презентера:
1) Меньше 100 строк
2) Все зависимости на другие классы через конструктор (что бы писать тесты без заморочками с даггером или др DI)
3) Не больше 2 зависимостей на другие классы. Если больше - значит что твой презентер слишком много делает, а он должен делегировать задачи на более низкий уровень.
Что думаете?
Сорян, а где тогда эта самая бизнес-логика?
И каково тестировать логику в UI, например, или в модели (если у тебя модель из rx-вызовов - ещё куда ни шло, а вот если лоадеры/асинктаски?)
>>881371
Разница есть, и охуенная. Толстый презентер тестируется на jvm. А в тонком лично я не вижу смысла
Я думаю что два с половиной сабскрайбера rxJava будут больше твоего презентера, о чем спешу тебе сообщить. Тащемта пагинация одна из наиболее простых и часто встречаемых вещей, добавим возможность фильтрации элементов, а еще например неможко экшонов с ними ( клики по лайкам-хуяйкам, например ). Все еще 100 строк ?
Да, в презентере тупо будут дергаться методы модели и подписка на излучаемые данные по скроллу списка плюс коллбэк на клики. Я вот сомневаюсь что у тебя выйдет меньше ста строк
Да блять, два маппера dto->vo уже будут 100 строк размером, че я заливаю то
>Сложный UI - сложные(кастомные) контролы
Читай: анимации по 100 строк, setTextColor, setVisibility, навигация между скринами и диалоги
>нет времени обдумывать архитектуру - положи код в презентер
>не знаешь к какому слою относится код - положи в презентер
В этом случае наверное код делает вещи из разных слоёв, и его стоит разделить, или переписать.
>не знаешь как сделать правильные зависимости - положи все зависимости в презентер
Странно. Презентер логично хранит ссылки на вью, и на внешний слой модели.
>Меньше 100 строк
Твои предложения для сложной предметной области?
>Не больше 2 зависимостей на другие классы. Если больше - значит что твой презентер слишком много делает, а он должен делегировать задачи на более низкий уровень.
А что мешает из вью сунуть презентеру ещё и адаптер, чтобы не дублировать кучу методов, и не превращать вью в помойку?
У меня он ещё хранит ссылку на RetainedFragment, в котором хранятся запросы. Хотя, без этого можно обойтись. Но в любом случае, все твои запущенные реквесты нужно где-то хранить
>Разница есть, и охуенная. Толстый презентер тестируется на jvm.
Начинающие программисты очень часто трактуют архитектурную модель MVC как пассивную модель MVC: модель выступает исключительно совокупностью функций для доступа к данным, а контроллер содержит бизнес-логику. В результате — код моделей по факту является средством получения данных из СУБД, а контроллер — типичным модулем, наполненным бизнес-логикой. В результате такого понимания — MVC-разработчики стали писать код, который Pádraic Brady охарактеризовал как «ТТУК» («Толстые, тупые, уродливые контроллеры»; Fat Stupid Ugly Controllers)
wikipedia
>А в тонком лично я не вижу смысла
Что самое главное в ПО которое мы разрабатываем?
Очевидно это: ПРЕДМЕТНАЯ ОБЛАСТЬ И обслуживающая ее БИЗНЕС ЛОГИКА,
ее и надо тестировать, а не реагирование на кнопки.
Тут хорошо расписывают: https://youtu.be/sydlYGDGHpc (там не про Android, в общем про архитектуру)
>А что мешает из вью сунуть презентеру ещё и адаптер, чтобы не дублировать кучу методов, и не превращать вью в помойку?
Простота не значит "мало кода". Если он у тебя дублируется код - вынеси его в отдельный класс.
Не пихай все в одном место, только потому что это сейчас проще сделать.
Это технический долг, который вылезет при добавление новой фичи в продукт.
Вью это Android UI часть, ее "Ответственность" это правильная отрисовка данных и показ анимации.
Происходит это через адаптер+listview или linearlayout - это конкретная имплементация, неважная на уровне БизЛогики.
>ее и надо тестировать, а не реагирование на кнопки.
>предлагает забить модель бизнес-логикой, и приложить портянку-презентер
>считает, что MVC == MVP
>суёт активную модель в Android
>ссылается на презентацию какого-то хуя из 2013
Прекрати, маня - ты вытекаешь.
А Clean Architecture под андроид как раз и топит за жирные презентеры, там сабскрайберы прямо в них висят.
>Происходит это через адаптер+listview или linearlayout
Всё дело в том, что адаптер у тебя отображает модель на вью. И ничего ты с этим не сделаешь - будешь либо сувать модель в адаптер извне, либо лезть и копаться куда-то за своей моделью из адаптера.
Одновременно он держит коллбэки view, всякие onViewAttached()
>это конкретная имплементация, неважная на уровне БизЛогики
Прилетает тебе ошибка, которую надо показать либо в снэкбаре (если вью находится в состоянии X, и эта ошибка впервые за время её существования), либо в лэйауте (если нет). Ты предлагаешь всё это сунуть во вью?
>А Clean Architecture
>под андроид
А под iOS / WindowsPhone / Desktop - у тебя тоже свои "clean architecture"?
Естественно. Ведь архитектура программы строится с учётом поведения окружения и платформы, а также физических возможностей реализации предоставляемыми средствами.
По аналогии с вкладками хрома, пока они его не переделали.
И чо, все клики/дисмисы и тд во вьюху из адаптера кидать а дальше в презентер?
И чо, все клики/дисмисы и тд во вьюху из адаптера кидать а дальше в презентер?
В начале обучения я почему-то себе запомнил, что обращения вида R.string.string_name дают int адрес ресурса вместо самого ресурса. Где истина?
setText() перегружен, зайди в исходники и сам посмотри, он там то же самое делает, просто берет контекст, из него берет ресурсы и подсовывает твой id
Ты еще много интересного обнаружишь, когда попробуешь посто цифру в TextView вывести.
Гроб Гроб Кладбище ResourceNotFoundException
Вот например простая задачка - отправить запрос на сервер и выжить при перевороте экрана.
Мутить сервис?
Это нормально вообще?
Аосо, сделал приложение по MVP + Viewstate. Работает, память не течет, Viewstate сохраняется и восстанавливается.
Но ведь с запросами в сервисе получится проще и компактнее, разве нет?
Перевернули экран - уебались, дернули сервис, забрали результат.
Какая блджад архитектура щас самый збс вариант?
Зависит от того, что у тебя за запросы. Если просто получаешь список элементов, достаточно в репозитории сделать запрос, сохранить в бд, вернуть всё презентеру.
Если у тебя загрузка файла или какая-то платёжная операция, то тут понятно нужно сделать так, чтобы она гарнатированно завершилась.
У меня запросы на сервер для электронной очереди: встать в очередь, уйти нах из очереди.
Где-то пару секунд занимают.
Не, от убийства приложения пользователем не поможет.
В целом - это достаточно надежный подход - через Intent Service?
Сделал так: IntentService, результат операции сообщает в UI через LocalBroadcast.
Когда мы отписаны от BroadcastReceiver'ов - считываем результат последней операции из SharedPreferences и удаляем его оттуда. Тем самым если юзер свернул приложение - при развороте ему показывают результат операции.
Все ок?
Пишу для друга лабиринт, написал свои view, которые по FrameLayout накладываются друг на друга слоями, а в onDraw на canvas-ах все примитивами рисуют. Мне нужно сделать анимацию перемещения шарика из точки А в точку B, в рамках canvas. Мой алгоритм какой-то такой:
Есть расстояние, которое надо пройти и частота. Расстояние делю на частоту и получаю dx,dy. Потом один большой цикл fori с пределом в частоту, где меняется координата по x+dx*i и invalidate, чтобы отрисовалась по измененным x y картинка.
В результате я пускаю, оно замирает на секунду-полторы (хотя старые изображения должны были исчезнуть), а потом резко прыгает в новое состояние. Короче, как до включения блока с анимацией, только еще пауза добавляется.
Нашел на stackverflow вариант с прыгающим мячиком
https://gist.github.com/CC-Ultra/60e7c5a797c9fcb509251f90d5d68837
https://gist.github.com/CC-Ultra/5594507170680660459b5995f548f2c8
И никак не пойму что в том коде такого принципиально отличающегося от моего. canvas.save/restore?
Поясните мне что я должен сделать, чтобы оно заработало
%operation_name% failed for %file/dir_name%,read-only file system
Какой командой это фиксить?
И каким терминалом на ведре пользуешься ты, анон?
Надеюсь не слишком платиновый
Тот же самый код работает как надо вне андроида.
Вот хз, сувать это в презентер, или в модель (а из презентера вызывать только комбинированный запрос)?
Ебашь всё в activity onCreate, чо как не пацан.
Если ты про su, то я ещё до скачки терминала зарутовал через кингрут, вошел в su, и вот это вот >>882349 написал
Вообще в этом треде этой хуйней не занимаются, попробуй sudo, а вообще возможно ты пытаешься чисто ведроидовские файлы потрогать. Можешь через adb shell попробовать.
>>882354
Ну охуеть вообще.
Причина в корявом драйвере.
https://github.com/SQLDroid/SQLDroid/issues/68
Причем, фикс проблемы был якобы аж 20 августа, но нихуя не изменилось, судя по всему.
Впрочем, у меня была версия 1.0.3, в то время как самая свежая - 0.1.1.
Очевидная нумерация версий такая очевидная.
1) findViewById заместо Butterknife
2) Glide
3) Всевозможное зануление вьюх и прочих ссылок в onDestroyView фрагмента
4) ретейн/неретейн фрагмент
5) singleInstance флаг
Каким образом FragmentManager вообще может держать ссылку на RecyclerView фрагмента, который был пересоздан ? Как она в него может попасть тащемта, и как ее оттуда выпилить ?
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
goBtn_text = (Button) findViewById(R.id.btnActTwo);
goBtn_text.setOnClickListener(this);
}
помогите !! у меня в строчке setContentView(R.layout.activity_main);
на букве R. ошибку выдает , и не только в этой строчке , во всем скрипте !
что делать ? куда отсылку делать ? ну или что добавить ?
Значит или класс не сгенерился или импорта на R нет.
clean, rebuild иногда помогает, а так, если что-то типа даггера используешь, то может из-за его ошибки не генерится
ты просто мудак, или не знаешь ответа?
Спасибо, все, улетаю.
solved, не нужно трогать ничего в onDestroyView :D
Использую Drive REST API для Android.
Сейчас делаю как предлагают в гугле - послать запрос к Drive и если поймали исключение - отправить КАКОЙ-ТО интент, который нам дадут в исключении.
начинаю охуевать с этих индусов
Этот код вполне нормально работает, но хочу без этой всей хуйни.
https://gist.github.com/anonymous/93396e8277e8ac803f15dc805781815c
После того как включил proguard получил кучу варнингов при попытке собрать release версию.
Как это пофиксить? Я так понимаю он вырезал к хуям все, что не используется?
Это же вроде часть OAuth-а ? Если так, то скорее всего можно через WebView, отлавливая дип линки
Да.
>>882666
Ты уверен, что тебе нужно использовать java sdk oauth, а не android sdk?
Ну а с slf4j ебись сам и вручную прописывай правила.
Я использую, а что?
И не только под Android, но и под iOS (robovm/libgdx).
Еще юзаю для скриптов на macOS, вместо баша.
Плюсы:
- весь код статически проверяется
- IntelliSense в IDEA работает
- знаний JDK достаточно для работы (не надо учить системные команды)
Вот к примеру скриптик для перекодирования куска видео в webm.
Без знаний джавы ты нахуй не нужен. Котлин приятное дополнение для знающих.
Loaders + ContentProvider и всё будет работать автоматически.
Или при пересоздании активити сохраняй позицию текущего элемента, а потом вызывай scrollToPosition
Адаптер сохраняется в retained фрагменте и при повороте экрана данные никуда не пропадают.
Позицию тоже можно в этом же фрагменте просто записать в переменную.
А что тут такого? Рассказывай давай.
Как минимум ты должен знать классы из JDK, тк у Kotlin нет своей библиотеки (только расширения к JDK).
Насчет языка мне сложно судить, тк я писал на Java еще до появления Kotlin.
А вообще знаешь как говорят
"Java довольно маленький язык, даже с лямбдами, они (программисты) его просто всасывают с молоком матери"
Алексей Шипилев
Думаю и ты всосешь его за пару недель.
Насколько я знаю, такие проблемы решаются -dontwarn
попробуй добавить в proguard-rules.pro
-dontwarn com.google.common.
Похоже я через жопу реализовал бесконечную прокрутку. В начале каждые 20 элементов у меня создавался новый лоадер, и я приписал им самовыпиливаться после onLoadFinished(). Полагаю, это неверный подход? Нужно реюзать один и тот же лоадер? Или для каждой подгрузки создавать новый?
1) Состояние адаптера сохраняет презентер
2) Состояние лэйаутменеджера сохраняется в onSaveInstanceState()
Алсо, почитал mosby и НИХУЯ не понял где хранить этот адаптер.
Он предагает 2 варианта: retain fragment и onsavedinstancestate.
Я сделал Parcelable адаптер ( по факту достаточно, чтобы итемы были Parcelable, мне просто приспичило сильно уж больно :D ), и в onSaveInstanceState/onViewStateRestored его закидывай и доставай
фу-фу-фу блять, нахуй ретейн фрагменты, хуй знает сколько проживет, хуй знает что там с ним происходит, only сохранения состояния внутри фрагмента
Окей. Куда тогда презентер сунуть?
>А использовал кто-то Loader-ы для сохранения презентера ?
Не надо. Это выглядит чертовски костыльно.
Зато чертовски эффективно, если я все-таки сумею заставить это говнище работать как надо. Ну какбэ когда презентер просто-таки обязан завершить какие-то операции, то по-моему это важно
Здесь используется Loader, мы не можем контроллировать тот индусский код, который сидит внутри.
Следовательно - это решение не надежно.
Какое у тебя тогда решение, которое позволит презентеру не умирать на смене конфига и закончить жизненно важные процессы ?
То есть предположим клиент начал транзакцию, перевернул планшет и пизда деньгам ? Дружище, да тебе ебллет порвут за такое приложение.
И все же, абстрагируясь, почему могут лоадеры не работать ? appcompat 24.2.1, в основе иерархии - AppCompatActivity, фрагменты все оттуда же, унаследованы от app.Fragment. В issue официальной, связанной с данной проблемой было написано, что решили ее в 24. Может я делаю что не так ? Хотя вроде как все аналогично примерам
Самый простой выход, который я вижу - добавлять последним элементом RecyclerView кнопку "обновить", если вдруг интернет соединение обрывается. Есть способ с автоматической подгрузкой сразу, как только соединение возобновится?
У меня broadcast receiver стоит на CONNECTIVITY_CHANGE на который поставлен листенер в компонентах, который выводит диалог а-ля "Нахуй сходи, нет инета" и предлагает перейти в оффлайн режим, после подключения автоматом перекидывает на онлайн и идет реинициализация всех последних загрузок, которые актуальны. Обрати внимание на то, что CONNECTIVITY_CHANGED может иногда не триггериться на пропадание сети, а потому проще всего сделать метод а-ля ping до гуглов, дабы проверить реальное состояние. При получении в каком-либо запросе UnknownHostException пробуй еще пару раз, мало ли, инет слабый, потом пинг, и в зависимости от него либо переводишь в оффлайн, либо снова пробуешь запрос отправить
p.s. ну и соответственно, эвенты изменения состояния подключения доступны отовсюду, то есть (в контексте rx) у тебя можно откуда угодно на них подписаться
Транзакция не должна выполнятся презентером. Юзер может в любом случае закрыть приложение и пизда деньгам, если ты делал её в презентере вне зависимости от того, как ты сохраняешь его состояние.
В таких случаях приходится использовать ведроидовские сервисы.
Ну да, только хотел про них сказать, но и там ведь свои проблемы, система очень не любит давать им жить
какая версия саппорт либы, что они работают как должны ? Или у тебя тоже умирают на повороте ?
Добра анон, сделал, как ты предложил. Осталось только одна проблема - при смене ориентации с вертикальной на горизонтальную RecyclerView отматывает назад на произвольно количество айтемов. При смене с горизонтальной на вертикальную все работает идеально.
там есть такая тема вроде, что если меняешь layout вьюхолдера - то нужно будет вручную закидывать lastVisibleItem и например оффсет по нему. Довольно сложно, но я другого решения не вижу, а потом smoothScrollToPosition (или как его там)
Еще есть возможно проблема восстановления в том, что ты не в onResume восстанавливаешь стейт, а в onViewStateRestored
У меня это реализуется через проверку "в лоб" при каждом запросе. Если он доскроллил до низа, и инет не появился - запрос (который триггерится по скроллу до последнего элемента), бросает экзепшн - и юзеру показывается сообщение. Если юзер ещё раз пытается делать скролл - запрос пускается.
Не вижу смысла делать всю эту еболу с коннективити-чейндж, т.к. срабатывает это дело не всегда, да и неуместные доёбы в приложениях типа ютуба "офлайн-режим, нет пути, пидор" меня лично раздражают
Тащемто пингануть можно всегда, а connectivity_change гарантированно сработает при появлении подключения к сети
и да будет все выглядеть как говно, угу
1) Нет. Сохраняется именно состояние адаптера, которое надо отобразить (списочек с данными, флаг подгрузки и т.д.). Где сохраняется? Либо в самом презентере (если живёт), либо пишется в onSavedInstanceState.
2) У LinearLayoutManager есть метод onSaveInstanceState, который сохраняет все данные об отображении, включая позицию при скролле. У своего ты можешь переопределить
Последняя. Никто у меня не умирает. Делаешь что-то неправильно, раз лоадеры у тебя не так работают.
Да вроде как работает все только если юзать getActivity().getLoaderManager().initLoader...
Использую в onActivityCreated.
>То есть предположим клиент начал транзакцию, перевернул планшет и пизда деньгам ?
Это делается в foreground сервисе.
1) Ага. Т.е. в случае если этот фрагмент был пересоздан - максимум что случится - будет отображено НЕ ТО?
>>883326
Вы дауны, или притворяетесь? Foreground сделан не для этого. С ним еще нужно нотификацию пилить. Пруфаните хоть одно апи, где для платежа пилится форграунд.
Не сохранять презентер != не сохранять данные.
onPause вроде вообще всегда вызывается, даже при дикой нехватке памяти. В нем отменяется реквест, и состояние можно сохранять, и мессадж запилить.
Если очень надо в бэкграунде, пока приложение свернуто - интент сервис.
>Если очень надо в бэкграунде, пока приложение свернуто - интент сервис.
Пользователь заходит в Recent, смахивает приложение и IntentService убивается мгновенно и следовательно - транзакция не выполнена.
А можешь за IPC пояснить ?
Суть такая, я реализовал следующие элементы:
1) TransactionEntity - Parcelable объект, который подается на обработку со стороны активити ( например ) сервису. Дублировал в aidl.
2) TransactionEvent - Parcelable объект, который собственно будет передаваться обратно. Содержит, например, id и status поля.
Тоже описан в aidl.
3) TransactionCallback - интерфейс, описанный в aidl, в котором один метод: onTransactionEvent(in TransactionEvent transactionEvent). Он должен позволять передавать в активити (если она не сдохла к ебеням) соответственно итог обработки TransactionEntity
4) TransactionListener с методами:
addCallback(in TransactionCallback callback, in long cookie)
и
executeTransaction(in TransactionEntity entity, in long cookie)
опять же в aidl.
5) Сделал соответственно сервис, в котором коллбэки хранятся в RemoteCallbackList, ну и по куке ( при ее наличии, при отсутствии будет наверное уведомление ) выкидывает результат.
Логично ли такую хуйню вообще вертеть ? Вроде как понравилось, что можно неограниченное количество "рецепиентов" на сервисе держать таким макаром, да и не засоряет никаким говном основной код. Ну и заработает ли оно ? Плюс, как можно заставить сий йоба-сервис жить так долго, как только возможно, а при убивании оного кэшировать все, что есть, перезапускать и по-новой ?
Лучше бы Kotlin 1.1 обсуждали (недавно вышел M03)
Ты хуй изо рта когда вытащить успел ?
Обсудил тебе за щеку.
Есть ли тут люди, которым удалось устроиться ведроёбом? Как вам это удалось?
Через постель.
Получилось только через знакомства.
Нашел заказ через знакомства. Потом еще один такой нашел.
>>883223
Каким-то магическим образом, позиция сама восстанавливается корректно, без излишних телодвижений с моей стороны, но только тогда, когда перед поворотом есть >40 подгруженных неотображенных элементов. А вот если перед поворотом находится близко к концу списка, то после него произойдет откат на n элементов назад.
Логгирование показывает, что во втором случае всегда срабатывает EndlessRecyclerViewScrollListener и подгружает еще элементы. Попробую либо подгружать больше элементов заранее, либо как-то избегать первого срабатывания после поворота экрана.
Очевидно что как мобильный девелопер
- Я знаю Kotlin и стандартную библиотеку Java лучше чем Python
- У меня есть настроенная IDEA с код-комплитом
плюс в Kotlin есть подходящие плюшки
- Официальная поддержка скриптинга (в след. версии можно будет подключать любую Java библиотеку из мавена)
- Много "сахара" для I/O операций
Подскажите плиз, как реализовать лучше всего меню, как drawerLayout, только снизу? У самого drawerLayout можно выставлять gravity только LEFT и RIGHT.
да, то, что мне было нужно, спасибо)
Уже 19, если тебе похуй на 13%.
К середине следующего года. А так надо следить, когда на сдк<21 будет 10 и менее процентов людей, то уже можно класть болт на них и спокойно разрабатывать со всеми плюшками материал дизайна и т.д.
при создании проекта пишет, что мин сдк 19 покрывает лишь 74% девайсов. Это очень мало, надо ориентироваться, чтоб не менее 90%. Так что это твиттер каких-то чуваков, которые слабо шарят в теме и от понта написали минсдк 19.
Как ты справляешься с android.os.TransactionTooLargeException? Или у тебя очень мало итемов?
Благодарю.
Какая же хуйня ваш package by type.
Для bottom navigation их слишком много.
Navigation drawer плох тем, что лишние движения пользователю нужно делать.
Выпадающее меню тоже не очень
Дать пизды дизайнеру за кучу табов, если не придумает ничего другого, оставить как есть.
Я и есть дизайнер, вот и пытаюсь придумать что-то получше.
мне стало хуёво, это нормально?
Есть.
Там же наллы не поддерживаются в observable-последовательностях, это просто пиздец.
пацан паттернами обмазался
Хорошо ведь. Еще маленький шажок в сторону null safety
Наоборот хорошо, а то я всегда filter на null делаю
Maybe зачем сделан ?
https://2ch.hk/pr/res/884999.html (М)
Если новый тред зря создал не обоссывайте, обсудим здесь.
Ну да, это не орм вообще то
О нит, ну пажалуста нинада :(
Сначала это поломанное говно не закрывает подлючения к бд, а теперь выдает при обработке ResultSet с длиной в 1 элемент:
Caused by: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1
Хоть сам садись и пиши драйвер.
Пичот епта! Ну почему ебучие гугломакаки прибили гвоздями свой несовместимый с другими платформмами ебучий велосипед, а не православный JDBC, с которым можно иметь один код на несколько проектов?
Ебать дебил. Откуда я тебе его вызову, если мой код под JDBC? Это должен вызывать драйвер.
Пиздец ты тупой.
>>885352
>2016
>JDBC
>Cursor
Прогирал с вас обоих. Первое, что нужно делать на такой легасне - решать: StorIO, ormlite или realm.
Выглядит интересно. Но в storIO, например, я так и не понял, как запилить аналог SELECT EXISTS(SELECT бла бла).
+ Опять же, не вычленить пересечения из таблиц. И нет, вытаскивать содержимое каждой и сравнивать ручками не вариант, если таблицы большие - оперативка от этого лопнет нахуй.
Это известная проблема. Только собственные костыли в координаторе с рассчетом оставшейся инерции и псевдоскроллом.
бери greendao, топ по скорости, да и с третьей версии очень удобный ( на JPA/Hibernate чем-то смахивает )
>Опять же, не вычленить пересечения из таблиц.
Берешь rawquery и хуярить intersect или что ты там хочешь. Или если не запрос то просто executeSql.
Черт знает, наврядли. Я тестил с использование robolectrics + mockito. И то баговало, но зачем там тесты ? Он простой, ошибки только при тотальном незнании SQL будут
Поддержки LibGDX / RoboVM / Intel MOE я так понимаю можно вообще не жать
те кроссплатформу на нем напишешь.
Вот и приходится на OrmLite сидеть тк он поддерживает JDBC
Да, я же разрабатываю на андроид.
Поправка насколько мне известно сейчас такой функционал предлагают Cursor и Realm. Курсор не нравится тем что для разнотипных вьюшек выглядит довольно печально.
Зависит от размера класса. Может к тебя там тупо две координаты тогда ты блять заебал уже, ты когда-нибудь уже доделаешь свой проект?, то пусть по 24 байта на объект, всего то 240кб, битмапы больше жрут.
Ты меня с кем-то путаешь, наверное.
Клиент для двача.
Пагинация же, лол, берешь и rxAdapter мутишь. Все решается в один стрим.
Свой кастомный RxAdapter. Как он поможет в пагинации ? Он будет под нее заточен ^_^
Так когда он в верх прокрутит в памяти будет куча итемов, я же этого опасался.
Безопасно ли модифицировать таблицу нескольким пользователям одновременно?
Больше интересно: сколько экранов в приложении на джуна должно быть, либо какой специфический функционал?
ПЕРЕКАТ https://2ch.hk/pr/res/885914.html (М)
ПЕРЕКАТОВИЧ https://2ch.hk/pr/res/885914.html (М)
Ну я за итемы и переживал.
Вы видите копию треда, сохраненную 19 декабря 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.