Это копия, сохраненная 21 июня 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Предыдущий тред тут:
https://2ch.hk/pr/res/743301.html (М)
Коротко о главном:
1) Мобильная разработка - это весело.
2) Android Studio & Java - легитимный набор, проверенно временем и поддерживается гуглом.
А также о неглавном:
3) PhoneGap/Ionic/Titanium/ReactNative - имя им javascript, принципы у них разные, первые три попытка в кроссплатформенность одного кода, ReactNative проповедует другой подход, а именно написание разного кода но на одном языке. Популярность у них разная как и размер комьюнити.
4) Xamarin - мультиплатформенная разработка. Попытка серебряной пули на C#. Довольно популярный. Куплено Microsoft. Теперь есть бесплатная версия.
5) BugVM (RIP RoboVM) - идейный наследник ксамарина, а теперь уже и его часть но на Java. Учитывая что Microsoft убила RoboVM, встречаем опенсорсный BugVM.
Отдельного упоминания стоят:
1) Kotlin - Java от JetBrains, новый и стильный язык, куча синтаксического сахара прилагается, есть стримы и делегаты. Хотите писать на котлине? Добро пожаловать в JetBrains и Avito.
Где брать инфу:
Интернет-ресурсы
1) http://developer.android.com/index.html
Наша библия. Документация/небольшие примеры/гайды. Но только на инглише, но это плюс. Минус в том, что это все таки документация с небольшими примерами и гайдами и искать там реализацию чего-то хоть немного сложного нету смысла. Раздел Training как раз для старта.
2) http://stackoverflow.com/
Пользуюсь чаще чем первым сайтом. Можно найти практически все.
3) Есть два вполне вменяемых русскоязычных ресурса. Для старта подходят очень даже.
http://startandroid.ru/
и
http://developer.alexanderklimov.ru/android/
Второй еще и условно бесплатный. Главный плюс - это русский язык, простые гайдики, но переводы классов иногда заставляют фейспалмить.
4) http://habrahabr.ru/ - редко но метко, можно найти годные статьи по каким-то реализациям, или переводы с developer.android. Хотя чего тут объяснять.
5) https://www.udacity.com/ - в треде очевидцы говорили что есть годный курс, но я лично не смотрел.
Книги, их никто не читает, но все советуют только одну
1) The Busy Coder’s Guide to Android Development - в отличии от остальных книг она обновляется, а так как ведро не стоит на месте а хуярит семимильными шагами, то я бы и не советовал другие книги.
А теперь, так как заебали уже всех, гайд для:
>"Я хуярил на делфи 5 лет назад а теперь хочу вкатится в андроид":
Чтоб быстро хоть как-то вникнуть в джаву берешь и гуглишь javarush или codingbat.com.
Можно Эккеля "Философия java" почитать.
Или Хорстманн "Java. Библиотека профессионала" до 7 главы.
Что тебе нужно понять в самой жабе.
Энтри лвл.
1) ООП - сам принцип нужно именно понять, так как ооп язык.
2) Типы данных. Примитивы и ссылочные.
3) Структуры данных - Массивы/коллекции - без них никуда. Полезно почитать про алгоритмы работы коллекций и их сложности.
4) Дженерик типы, они как раз юзаются в коллекциях.
5) Классы/интерфейсы и все вытекающие.
Уже можно быдлокодить потихоньку и учить андроид параллельно с тем что ниже.
Дальше
6) Потоки ввода/вывода (streams). Не путать с тредами(threads).
7) Threads, особо не нужно вникать(в java.util.concurrent можно не лезть, в ведре все равно особо не пригодится), но нужно понять как работает многопоточка и что такое Runnable.
8) Прочитать про паттерны что-то. Начать с listener, adapter, singleton, iterator так как на каждом шагу. Ну и по накатанной.
Уже сделаешь что-то нормальное.
Дальше.
9) Работа с Sqlite, нужна будет в любом случае.
10) Работа с json.
Привет клиент-серверка.
Пишите в треде что добавить.
merci ^_^
Ракурсы, бро, ракурсы.
Частично
Своему сердцу, очевидно же.
http://pastebin.com/h3tpfsTb
З.Ы. Гуглил решения, но ничего не понял
Не понял как знание курсора влияет на вопрос. Типа слишком капитанский, когда возращаешь данные в массив перебирая курсоры ты тупо делаешь тоже самое только например с обрезанным функционалом типа нотифаинга добавления отдельных элементов ?
"Не учатся ничему некоторые и учиться не хотят. Кина про фрилансеров с 300k насмотрелись..." (c)
> CursorAdapter = Cursor + Adapter
> Не понял как знание курсора влияет на вопрос.
Ну вот как с тобой разговаривать?
Курсор и курсор адаптер это механизм отображения данных из базы времен CPU 300 МгЦ и 128 MB RAM.
Его плюс что данные он хранит в памяти компактно одним куском (тк написал большей частью на нативном коде).
(Еще и подгружать их может постепенно, но не в случае RecycleView/ListView)
Так что сейчас использовать его есть смысл только если ты юзайешь SQLite и упираешься в производительность.
P.S.
Старайся либо писать компактные предложениями, либо делать перенос после 80-150 символов.
Иначе ужасно неудобно читать, особенно на FullHD мониторе.
Спасибо за ответ, просто при поиске sqlite+recycleview по тому же стаковерфлоу
выдаются ответы типа этого
http://stackoverflow.com/questions/32101607/populate-recyclerview-with-a-sqlite-database
где ответ примерно с такой же реализацией как у меня, а комент к нему наоборот советуeт
реализовывать курсор адаптер типа этого https://gist.github.com/Shywim/127f207e7248fe48400b
и вот и возник вопрос как собственно народ запихивает данные в recycleview
>неудобно читать
Купил себе ссанину и других теперь учит как правильно писать, чтобы шея не открутилась при чтении.
мимо квадрат 1к
>Его плюс что данные он хранит в памяти компактно одним куском (тк написал большей частью на нативном коде).
(Еще и подгружать их может постепенно, но не в случае RecycleView/ListView)
всегда думал что курсор используется для экономии оперативы, что б не грузить все сразу в массив./arraylist
Если ты делаешь просто moveToNext(), то курсор грузить данные из базы постепенно, увеличивая в размере свой буфер.
Чтобы ты мог сделать moveToPrev() или moveToFirst() быстро, без запроса к базе.
Кстати данные из базы грузит не построчно, а большими кусками и еще есть ограничение на размер его буфера (CursorWindow).
Но это уже нереливантные подробности, которые можно изучить если посмотреть его исходники.
НО для правильного отображения скролбара, ListView дергает -> Adater.getCount() -> Cursor.getCount().
А курсор может рассчитать getCount(), только если проитерируется по всем данным -> в итоге все данные загружаются разом в память
(в пределах максимального размер CursorWindow).
Именно поэтому CursorLoader вызывает явно getCount() у курсор (во время его асинхронно загрузки).
http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/content/CursorLoader.java/#68
Это схуяль платные пуши?
Есть какой нибудь толковый гайд по адаптивной вёрстке? на дев андроид есть только какая то мелкая херня.
Ну пора понять что не бывает адаптивной верстки как во фронтенде.
Так можно детектить ньюфагов и долбоебов кстати.
Специально для тебя:
React Native - фреймворк для разработки iOS и Android приложений, использующий нативные виджеты и анимацию, контроллируемые JS кодом с помощью библиотеки React.
Использует систему лэйаута flexbox, позаимствованную из веба.
https://facebook.github.io/react-native/
https://css-tricks.com/snippets/css/a-guide-to-flexbox/
Опять же, нету адаптивности блять.
Вся адаптивность сводится к тому что делается скролвью которая типа делает приложение адаптивным по вертикали, и дизайнеры пытаются не тулить много говна по горизонтали.
Такая же хуйня есть и у джавы, кастомные флекс вьюхи.
Но вопрос в том, что это никак не ебучий бустрап который люди тут ищут. В результате он просто подвинет итемы в новый ряд которые не влезли в ширину.
Это твоя адаптивная верстка?
Ебитесь-ка в жопу джаваскриптом где-нибудь еще.
Вообще-то в плане адаптивности бутсрап - это жалкие костыли по сравнению с флексбоксом.
Какая фича бутстрапа тебя интересует? Responsive grid? Так на флексбоксе он гораздо более responsive, чем бустраповские костыли в стиле "col-xs-6 col-sm-4 col-lg-3 col-xl-2".
Не хочешь чтобы айтемы двигались в новый ряд? Ставь им всем 'flex: 1' и фигачь в один горизонтальный контейнер - будут ужиматься, сколько бы их там не было (но это уже не responsive grid, с точки зрения терминологии)
Чувак я тебя сразу прерву.
Называть самую мощную технологию веба на данный момент в адаптивности - т.е. бустрап костылями это еще мозгов надо иметь.
Ну и действительно реактнейтив нахуй никому не уперся,
джава/котлин > хуемарин > моча > фонгеп > вся остальная джаваскрипт параша(проигрывает фонгепу из-за коммьюнити которого нету)
Вот почему дизайнер такой пидор?
> 2016
> Андрейд
> 3Д карусель
Этот пидор не хочет делать отдельный дизайн для ведроида, этот пидор сделал дизайн для iOS.
И там эта блядская карусель. Собственно вопрос:
Как сделать вертикальную карусель чтоб как в iCarousel?
Нет ничего проще, ищи инфу куда копать, бери неделю-две времени, менеджер сам выебет дизайнера.
Кюти нету, успокойся. С такими темпами можно вьебать го и кучу всего еще, если ты не знал на ведро есть возможность писать практически на всем.
Моча была показательной границей ваябл технологий.
Да вообще охуеть. Я вот только работать устроился. Летом подработать. И вот дали проект. Офигеть. Я чота застремался менеджеру сказать, что нихуя не получается карусель делать. Да там куча всякого iPidor-ского говна в дизайне. Ну и такой диалог с менеджерем был
— Ок. А андроид дизайн где?
— Лан, с дизайнером побазарю
… неделя
— А андроид дизайн когда выйдет? а ассеты скинете? где?
— Дизайнер сказал, что этот норм на андроиде выглядить будет. Можешь блюр убрать
Ну чо за хуйня?
На Qt написано, например, приложение 2ГИС. Посмотри, если не видел.
> есть возможность писать практически на всем
Я в курсе, спасибо. Только вот Qt в отличие от "всего" действительно используется и распространён.
Ну тут смотри, я просто не знаю как у вас там механизм работает.
Но находишь того кто более сговорчив.
Если это менеджер то подходи и говори.
- Я не нашел реализации этого инструмента, он не предоставлен в сдк, следовательно мне нужно его делать самому, учитывая что он довольно сложный это займет столько то времени минимум. Мне делать его или пойти более простым путем и сделать горизонтал скролинг вью из того что есть в миллион раз быстрее?
Менеджер выберет второй вариант так как никто никогда не рассчитывает что вьюха может забрать больше чем пол часа.
Если же говоришь с дизайнером.
- Братишь, что за говно ты мне подкинул? Это не по материал дизайну. Реализаций инструмента нету, я могу сам сделать но это займет овердохуя времени, а сроки то жмут. Переделывай, ну и желательно посматривай на материал гайды, так как они не просто так созданы.
Главное правило ГОВОРИТЬ ЧТО ТЫ МОЖЕШЬ ЭТО СДЕЛАТЬ но долго, ГОВОРИТЬ ЧТО ТЫ ЗНАЕШЬ КАК СДЕЛАТЬ БЫСТРЕЕ.
Удачи.
Спасибо. Прям мозги на место мне поставил. Так и напишу завтра.
Я один раз хотел написать, но менеджер думал, что я уже неделю как над проектом работаю, а я всё бух сессию заканчивал.
Я вообще, можно сказать, что на удалёнке. В соседнем городе работаю. Связь по интернету.
Ну и пускай, нехуй тупые задачи ставить. Менеджер на то и менеджер чтоб ты сидел и писал код не парясь про то что у тебя говно вместо задачи.
Что ты сука зеабывешь, иди в свой сраный 2гис и сиди там нахуй, куча долбоебов написавших на некроплатформедля ведроида уж точно апу. Успех блять.
Чем они мотивировались то?
Я ему сам случайно сказал, что всё уже чики-брики и в дамках будет.
Не, они, конечно, молодцы, что наняли (не платили ещё, без договоров и всего) одного уже-не-первокурсника без единого сделанного приложения и какого-то мутного иосника, который вот только с сентября objective-C начал учить.
Я думал меня на изи фигню поставят, а они во как…
не знаю почему, но засмеялся, что даже соседа разбудил
А вот так не делай, если уже и еблуешь, то создавай видимость работы, пиши ему что-то, любую хуйню.
>>752259
Ну язык твой враг твой.
Но со временем пройдет.
ну сдк любых карт почти всегда написаны на ndk, видимо пидоры из 2гис решили просто хуячить сразу на qt
Ебать, да это же лучшее решение евар блять, проджект менеджера нужно сделать главой какой-то компании. Дали поддержку ндк, не давай пердолится в жопу и писать все на плюсах.
Стоит говорить что-то вроде "я короч пытался поискать готовые вьюхи, нихуя не нашёл. Показать нечего, я бэкенд фигачил. Пусть нормально для ведра рисует!"?
Ты не понимаешь, о чем говоришь?
> Дали поддержку ндк
Eclispe NDK сейчас deprecated, а альтернативу ему гугл уже два года выкатить не может
> не давай пердолится в жопу и писать все на плюсах
Ээ, а NDK по-твоему на чем написан?
>Eclispe NDK сейчас deprecated, а альтернативу ему гугл уже два года выкатить не может
вот вчера только выкатили вроде. на io сказали, вроде
Если только начал, толкай хуйню
"Я пока делаю общую архитектуру связи между бд и экранами" и тд. Вообще это действительно сложная и долгая часть, но учитывая что ты все равно будешь все пиздовать как попало из гайдов, то забей. Это норма для первой аппы.
Поискать это два дня от силы, если ты не нашел и отписал об этом через два дня и предложил вариант как сделать подругому - ты норм парень. Если ты 5 дней искал и не нашел - то ты долбоеб. Так оно выглядит со стороны.
Скажи мол архитектура в процессе разработки пару дней уже пишу и продумываю. Вот решил посмотреть на эту карусель, проебался полтора дня и нихуя не вижу такого решения из коробки, потому чтоб не тратить зря время пишу вам, и пишешь то что я говорил выше.
На ндк писать можно, что ты тут пытаешься втюхивать я не пойму?
>Ээ, а NDK по-твоему на чем написан?
Очевидно что на пизде твоей мамаши на плюсах, хватит меня за долбоеба держать правда бесит, анон сказал про карты на плюсах, так сделайте вы карты на плюсах а все остальное на жабе, благо так можно делать. Дальше понятно?
> Дали поддержку ндк, не давай пердолится в жопу и писать все на плюсах
> Противопоставляет NDK и плюсы
> хватит меня за долбоеба держать
Всегда пожалуйста, сам работаю на фултайме на удаленке по два дня из пяти, правда нужно увольняться, а то превратился в охуевшего ублюдка который бесится когда его тревожат в рабочий день звонком с работы.
Что-то я такого не видел. Есть ссылка?
Они интегрировали CLion в Android Studio и новый декомпилятор, но про NDK я ничего не видел нового
Ты рахит? Ты хочешь на ндк писать всю апликуху?
Неужели не очевидно что я имел ввиду юзать нужные элементы типа карт на ндк, а все остальное на жабе? Я кажется написал это дословно.
>анон сказал про карты на плюсах, так сделайте вы карты на плюсах а все остальное на жабе, благо так можно делать
Еще вопросы будут?
Мне всё ещё еклипс больше нравится.
Помню в старых версиях студии на хоткей, который текстовое поле показывает, куда можно команду писать, можно было написать new activity и новое активити делалось. Потом я всю зиму пользовался еклипсом прост)) и вот скачал свежую студию. Там этот хоткей вообще в говно скатили. Какое-то говно предлагает, настройки студии находит, new activity не может. Я что-то не так делаю?
Ладно, я начинаю понимать, что мне студия больше нравится.
Но Jetbrains — пидоры. IDE платными делают. Пиздец. Вот еклипс — бесплатный
>Помню в старых версиях студии на хоткей, который текстовое поле показывает…
Так вот в еклипсе Ctrl+n ваще классно работает
С адекватами которые рушат твой манямир?
>>752296
Потому что они делают иде у которой практически и конкурента нету, а эклипс говно устаревшее, его никто никогда не купит.
Все так говорят, а ты купи еклипс
В это и смысл. Спрос и предложение.
finish()
> говнарей
Значение знаешь?
Алсо, андроид студию не люблю из-за системы сборки. С одной стороны, это круто и удобно, с другой — невероятно медленно. Сидишь по 20 секунд ждёшь, пока приложение сбилдится после смены 1 строчки кода.
аа, в еклипсе ant юзаешь? я тож люблю, еще maven норм. а ентот градле, ну его, хистерская хуйня
Нет, без анта, встроенным билдером.
блокнот + консоль
А где инстант-ран, поддержка байдингов, редактор строковых ресурсов, редактор тем?
В этом и суть
http://pastebin.com/NUaSrwDa
Пример запроса —https://api.github.com/search/users?q=поисковыйзапрос
Пример ответа сервера:
{
"total_count": 7498,
"incomplete_results": false,
"items": [
{
"login": "liblfds",
"avatar_url": "https://avatars.githubusercontent.com/u/2772362?v=3",
"html_url": "https://github.com/liblfds",
и т.д...
},
{
"login": "zensh",
"avatar_url": "https://avatars.githubusercontent.com/u/863754?v=3",
"html_url": "https://github.com/zensh",
и т.д...
},
и т.д.
]
}
> самую мощную технологию веба на данный момент в адаптивности - т.е. бустрап
Можешь дальше не обсираться, ты и так уже по уши в говне.
Бутсраповский грид - это костыль для браузеров, не поддерживающий 'display: flex' и 'display: grid'.
В отличии от тебя, я умею верстать и могу сделать аналог бутстраповского грида на CSS без помощи интернета. Я понимаю как он работает и понимаю его ограниченность.
А для тебя вёрстка кажется магией, поэтому ты дрочишь на популярные фреймворки.
Ты ещё, блять, скажи, что jQuery - это самая мощная технология веба на данный момент в селекторах и ajax-запросах.
У вас React Native в шапке есть, вот и зашёл.
>это костыль для браузеров, не поддерживающий 'display: flex' и 'display: grid'.
>костыль для браузеров
Мне кажется просто твоя технология говно раз не поддерживается 3 - 5 браузерами?
А ты думал, раз сидишь в Android трэде то в вебе никто не разбирается, и можно пиздеть что попало про веб с видом эксперта?
На предыдущей работе делал UI для системы мониторинга, верстал все на flexbox, ибо требовалась поддержка только Chrome и Firefox.
Далее, если ты погуглишь, то найдешь много блогпостов на тему того, что бутстрап не нужен т.к. определяет слишком много глобальных стилей (в отличии от foundation который можно использовать через sass миксины или модульного basscss).
И вообще, бутстрап создавался в Твиттере для прототипирования, а не для использования в конечном продукте. Тут, кстати, много аналогий с Ангуляром, который тоже создавался не для продакшена, и не используется компанией-создателем в своих продуктах. У обоих большая аудитория, но она целиком и полностью состоит из ньюфагов, желающих наговнякать что-нибудь не вникая в детали. А прошаренные люди шарахаются от этих фреймворков как от обоссанных бомжей.
съебите уже в жс тред
Удобнее все же использовать Observable<Response<GitHub>> для того чтобы можно было юзать .code() и не париться с получением кода ошибки
Клонирую проект с гитхаба, делаю пару изменений в коде, а потом возникает пикр при отправке апк на приложение. Студия самая последняя, со всеми обновами, с Canary. В чём проблема?
А ещё в чём проблема грэдла на 2 минуты?
P.S. Буквально 2 недели назад такого не было.
Сам грэдл - http://pastebin.com/hypVVjPK
Лог ошибки
$ adb shell pm install -r "/data/local/tmp/com.huy.pesda"
pkg: /data/local/tmp/com.huy.pesda
Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]
Installation failed since the APK was either not signed, or signed incorrectly.
If this is a Gradle-based project, then make sure the signing configuration is specified in the Gradle build script.
Error while Installing APK
P.P.S. У ТЕБЯ ВИСНЕТ и все подобные ответы не принимаются, у меня макбук про, студия не виснет тут.
> Installation failed since the APK was either not signed, or signed incorrectly.
> If this is a Gradle-based project, then make sure the signing configuration is specified in the Gradle build script.
Есть MapView, который можно пихать в любой контейнер. Только события лайфцикла передавать не забудь.
Хмм, а пример не подкинешь ? У меня почему-то MapView нуль вместо карты выдавал при использовании getMap()
Продублируй методы жизненного цикла в свою кастомную вьюху, а оттуда вызови их у MapView.
Спасибо, щас на эмуляторе забью свой гугл плэй аккаунт, посмотрим что будет
я onCreate каким макаром могу в чем-то унаследованном от View сделать ?
Дурачок какой
Берешь и в onCreate своей активности вызываешь onCreate у MapView. В чем твоя проблема?
Ты тупой или что ? Сука, говорю тебе, все должно быть во View. Хули ты такой непробиваемый то
Если ты такой пиздатый, расскажи это гуглам, чтобы они убрали onCreate, onPause, onResume, onLowMemory и др. из MapView.
А сейчас, либо прокидываешь вызов этих методов, либо идешь нахуй.
маму же твою, хули ты советчик такой, не читаешь вопросов а потом очко от ожогов мажешь ?
onResume по завершению коллбэка нужно делать
У тебя блять есть кастомная вьюха, в чем твоя проблема добавить в нее onCreate(Bundle) и вызвать этот метод в onCreate активности?
Нет, буду вонять и нести хуйню, что все не то, и все не так.
В том что вьюха полностью абстрагирована, доступ к ней получить из активности не нужно и нельзя
> В том что вьюха полностью абстрагирована
Потому что ты так захотел? Гуглы захотели по другому, и причины на то у них были.
> public class MapView extends FrameLayout
> Users of this class must forward all the life cycle methods from the Activity or Fragment containing this view to the corresponding ones in this class. In particular, you must forward on the following methods:
> onCreate(Bundle)
> onResume()
> onPause()
> onDestroy()
> onSaveInstanceState()
> onLowMemory()
Либо делай фрагментом, либо прокидывай жизненный цикл. Другого не дано.
Вот ведь гуловцы говноделы, сначала они говорят что View должны быть абстрагированы от лайфсайкла
, а потом сами же лепят вьюхи которым нужны эти методы.
Да и вообще это же полная хуйня их onPause/onResume и тд - хочу встроиться в жизненный цикл фрагмента,
так надо делать касмтомные классы на всех гребанные реализации (Fragment, DialogFragment, MapFragment, BottomSheetDialogFragment и тд).
Нет чтобы сделать события Resume/Pause... что бы откуда угодно можно было приатачиться.
MapFragment на то и Map, что там уже это реализовано. Ну и никто тебе не мешает обмазываться нестед фрагментами
>Тупо заменил свои названия. Стабильную версию студии ставить не комильфо, там нет ConstraintLayout, а я уже использую его в другом проекте.
Д - долбоеб.
только вот MapView нифига не MapFragment, а коли уж я flow-блядина, то мне MapFragment использовать ne cocher. В итоге поебавшись сделал нормальную отработку жизненного цикла, пришлось маленько абстракцией пожертвовать но хуй бы с ней, работает и на том спасибо
Карты юзают плейсервисы, а они в себе могут юзать хоть небо хоть аллаха, потому и не сделали как обычную вьюху.
А лайфсайкл нужно соблюдать на уровне ОС.
Так что так.
Не устанавливай превью билды блядь и тем более не юзай в продакшене, самый адекватный совет. Лучше не будет.
Значит надо было вынести часть которая работает с лайфсайклами в отдельный класс и передавать туда ссылку на вьюху.
Но что бы это работало актитити и фрагменты должны:
1) Либо реализовывать единый интерфейс, типа такого
interface LifecycleManager {
void addOnResume(Runnable callback);
void remvoeOnResume(Runnable callback);
...
}
2) Либо хранить его инстанц внутри (как на FragmentManager или LoaderManager) и возвращать ссылку на него
public LifecycleManager getLifecycleManager();
Охуеть, ньюфажина рассуждает о проектировании сдк.
Если серьезно, то если сделали значит по другому их костыли не работают.
Как ни крути на 2 года 11 месяцев больше твоего
>В этом и суть Single Responsibility Principle
Вообще-то нет, МапВью имеет одну задачу, работа с картой, то что карта в себе требует лайфсайкл уже другой вопрос.
Да и этот принцип довольно уебищным и гибкий когда абстракция на высоком уровне.
Если этой хуйне 5 лет то там пиздос должен быть, столько инструментов появилось даже на уровне сдк.
Что с рантайм пермишенами?
>Если этой хуйне 5 лет то там пиздос должен быть, столько инструментов появилось даже на уровне сдк.
Ну так а я про что, пиздос лютейший. Я внедряю кончено моднявые штучки иногда в новых вичах, но это как мертвому припарка.
>Что с рантайм пермишенами?
Забил на них, поставил targetSdk 22
Сочувствую. Надеюсь хоть зп и офис норм.
Работал на таком проекте пару лет, ну и сам во многом создатель этого пиздеца.
В итоге уволился (и тебе советую) и оставил разгребать это каким-то джунам :)
Крупные проекты рано или поздно один хрен в такое превратятся,
если не делать переодически серьезный рефакторинг (на который никогда не выделяют время).
говоришь такой, плюс 50% к зп, или я ухожу
если говорят уходи, говоришь такой, когда поймете что все плохо, позвоните мне, но тогда будет + 100%
профит
Берут тебя на +50% на два месяца и дают джуна подручного.
Я не в продакшне, а для себя.
Есть тулбар, есть лист и под ним ещё лист.
Я не знаю какие элевейшены задавать.
По гайдлайнам toolbar elevation — 4dp.
Я хочу чтобы, допустим, у белого листа было 16dp сколько поставить?. Получается, что мне надо тулбару выставить 16dp + 4dp, белому 16dp, серенькому 0dp?
Тогда ещё вопрос, тулбар в отдельный xml файл вынес и потом его инклудаю в активитях. В xml указал элевейшен. Как мне его переопределить, когда я его инклудаю?
Мне кажется твоя проблема в марджинах. падинги хуево смотрятся если их делать как у тебя в пике.
Никак.
елевейшены а не падинги
Анон, есть проблема. Не добавляет данные в listview. Я просто уже не знаю где рыть. Проблема в методе listenNewMessages(), метод displayMessage(chatMessage). В остальных местах все работает как надо. Хелп.
http://pastebin.com/tMphiKxP
Мне нравится как на пике. Плюс, пик с гугловских шайдлайнов
может у тебя в 137 строке надо вывести ex?
если надо 4dp - ставь 4dp, если 16 - ставь 16, в чем проблемы? Ничего высчитывать, складывать не надо
Если я беленькой поставлю 16, а тулбару 4, то тулбар тень на беленькую не отбрасывает
ну офк, потому что он выше тулбара получается, на пике вроде и у того, и у того 4dp
спроси это у производителей, даже гугл поддерживает свои мобилки ~2-3 года и потом кладет хуй, аппл в этом плане молодцы
Пидоры. Мне теперь свой второй нексус 7 менять надо будет с приходом 7 андроида =(((((
:237 ты создаешь адаптер, но не присваиваешь его ListView
absolutely disgusting
switch
Бамп вопросу.
Теперь я уверен, что дело не в Canary билде. Пробовал удалять приложение с телефона, чистить, ребилдить проект. НЕ ПОМОГАЕТ. Молю о помощи, ананасики.
И да, ОП-хуй, добавь в шапку ссылку на единственную конфу по андроиду в телеграме - telegram.me/AndroidChan
Все иди нахуй, мало того что ты дебил разрабатывающий на превью билдах, так еще социоблядок
>И да, ОП-хуй, добавь в шапку ссылку на единственную конфу по андроиду в телеграме - telegram.me/AndroidChan
Она не единственная.
Боже как это банально, избито (было уже на Google IO):
"как правильно делать очередную-хуйню-View" и "как обойти эти костыли в Android/iOS".
Единственное интересное это про Scala/Kotlin, да и там будет "введение в язык" (чего на ютубе и так полно).
Дай угадаю "стажер" ты на это наткнулся в своем коде надо было сначала книжки читать?
А вообще как думаешь для switch и if из примера важен порядок?
иди сам картинки рассматривай, по андроиду не встречал годных книг, да они и не особо нужны
> Дай угадаю "стажер" ты на это наткнулся в своем коде надо было сначала книжки читать?
Что?
> А вообще как думаешь для switch и if из примера важен порядок?
При чём здесь тот пример? Я сказал, что не стоит использовать Map с Integer в качестве ключа вообще.
Снова промахнулся. Но не расстраивайся, держи утешительный приз.
Это нелогично, не ? Хотя в исключительных ситациях м.б. Но они пиздец какие исключительные
В том примере какой в коде, ифом делать лучше потому что если это модуль апликухи, то ты не можешь юзать идшники как константы.
Если это твоя апликуха то можно свичем.
Мапой эту штуку делать верх дибилизма в данном случае, ладно бы у нас делегаты были.
По итогу просто сделал при том или ином триггере лайфцикла запись/получение/чистку данных о карте и соответственно теперь просто в onMapReady ставлю сохраненную CameraPosition
>В том примере какой в коде, ифом делать лучше потому что если это модуль апликухи, то ты не можешь юзать идшники как константы
шта?
>>754357
Сём, хватит.
>>754363
В телеге - единственная, другой я не нашёл.
Причём тут социоблядство? Ну откатился я с превью билда, проблема-то осталась. Или по делу сказать ничего уже не можете?
app/
Блять, сделай помимо апликухи еще встраиваемый модуль. Проджект стороний. Хз как тебе еще сказать.
НожДляМасла поможет
С себя что-ли?
С какими долбоебами в треде сижу, не понимают что пиздят, какие-то блять мапы суют.
Сука ну и даунята.
Как оно быть твердолобым уебаном?
http://stackoverflow.com/questions/8476912/menu-item-ids-in-an-android-library-project
Ну емое, ты мог сразу объяснить что не работает тк:
"В доп. модулях поля в сгенеренном классе R.id не final, а switch работает только с константами".
P.S. А вот switch (when) в Kotlin работает и с такими полями.
норм
Вообще все началось с уебана который доебался до ифа, я просто сказал что этому есть место и где тоже сказал.
Потом в меня полились тонны мочи, нахуй мне что-то объяснять?
Бамп вопросу.
http://pastebin.com/9pPafJJ4
Новый грэдл, убрал оттуда скам всякий, нихуя не взлетает. Пробовал подписывать вручную, удалять debug.keystore, даже .jks пересоздал - не помогло. Какие ещё варианты, ананасы?
как там в 2011?
Дохуя скопилось всяких файлов непонятных, т.к. проект был создан еще когда эклипс был актуален.
Как понять - какие файлы можно грохать?
В lint есть проверка на используемость ресурсов.
Вот этого двачую. Уверен, что это решение поможет
Скриншот сюда давай, что было там видно:
1) что старя студия
2) что в build.gradle/dependencies стоит 2.1.0
3) ошибка
Просто иди нахуй.
фоткай своё очко, я смогу помочь
Сериализуй и сохрани в виде бинарника.
Какими технологиями для отрисовки графики обычно пользуются успешные Android разработчики?
Не одними же Layoutами всё верстают, например, пикрелейтед.
Что не так?
>LibGdx / Slick2D / LWJGL
Это, как я понимаю, фреймворки и сторонние движки, верно? Этого бы мне не хотелось.
А вот OpenGL отличный вариант, но как в него вкатиться?
Да я другой анон, просто сказал что на опенгл какой-то вздрочь будет мне кажется.
Так само же предлагает установить ее с нуля, от чего отказываться?
я с нуля сдк поставил, как почистить тогда?
это адаптер listview
<script src="http://ideone.com/e.js/wbgv45" type="text/javascript" ></script>
это асинктаск
<script src="http://ideone.com/e.js/s37c3D" type="text/javascript" ></script>
это xml карточки
<script src="http://ideone.com/e.js/y1UMzu" type="text/javascript" ></script>
Внезапно папка system-mages 30 гиг. 20 гиг на версию 23, и 10 на пререлиз Н.
Спасибо, удалил нахуй это говно.
там затычка проявляется в момент отрисовки нового cardview
Значит дело в твоём говнокоде
У меня ссылка открывает окно в треть экрана, я не буду это читать.
Нахуя тебе инфлейтер в адаптере? Конечно, у тебя всё тормозить будет. Убирай его.
мне кажется, проблема в этой поеботе - ru.workcal.ExpGridView
а куда его запхать?
А теперь увидел, нахер после консруктора еще инфлейторы создавать хуй знает.
Блядь, ты еще и в асинктаске всё это делаешь. Ты ебанутый?
это не я писал :)
Ну, это другое дело, получать его в конструкторе — явно лишнее.
А вообще он нигде не создается, на него постоянная ссылка в контексте хранится, это не может влиять на производительность.
Инфлейтер в конструкторе сделать норма.
Да похуй, можно получить и в конструкторе и реюзать его везде.
А вот как это работает я хз, возможно там не просто ссылка.
LayoutInflater inflater = (LayoutInflater)ctx .getSystemService(Context.LAYOUT_INFLATER_SERVICE)
Мне впадлу, я сериал смотрю.
> LayoutInflater inflater = (LayoutInflater)ctx .getSystemService(Context.LAYOUT_INFLATER_SERVICE)
Палю вин
LayoutInflater inflater = LayoutInflater.from(ctx)
> А вот как это работает я хз
Один из паттернов же не помню какой. В контексте висит карта<string, object> со всеми сервисами, и ты по имени получаешь нужный.
>Палю вин
Так говоришь будто бы это не известно хоть какому-то деву с опытом больше месяца.
>Один из паттернов же не помню какой. В контексте висит карта<string, object> со всеми сервисами, и ты по имени получаешь нужный.
Круто че, буду знать, в сорсы особо не лазил, не знаю что там, вдруг какая-то лейзи подгрузка или еще чего.
Алсо, сам юзаю эту штуку с мапой иногда, интересно как паттерн называется. А еще им удобно вешать делегаты
Трудно верится что плаватель как рыба в довольно сложных технологиях и решениях не может себя прокормить.
>а че там сложного то лол?
>Ровная архитектура с абстракциями.
>Депенденси инжекшн, особенно в виде даггера где куча всяких фич.
>АрИкс - функциональщина внедряемая в ооп.
>че там сложного
асинктаск сложно? Соболезную.
Тест на сколько баллов? И гп сюда вкинь. Ты сам должен подавать заявки на предложения заказчиков.
Не корми зеленного. Я получаю свои 1200 и на еду хватает, нихуя из его перечня как следует не юзаю.
Тебе сколько? Как работу нашёл? На собесах что спрашивали?
17-лвл студент(скоро бывшим буду), пашущий на дядю по знакомству за 25к.
Лол, первый курс не школота?
23 уже, работать начал в 22 на 4 курсе, прогу учить целенаправленно но спустив рукава начал на 3 курсе, факультет итшный.
Что спрашивали не скажу так как спрашивают начиная от джавы заканчивая сервисами, но ничего сверхъестественного.
>асинктаск сложно? Соболезную.
>Тест на сколько баллов? И гп сюда вкинь. Ты сам должен подавать заявки на предложения заказчиков.
Ну я кинул уже 10 и пока что пусто. Ну мб не как рыба но я знаю эти технологии и успешно их применяю. Гп кидать не буду ибо дианон. Теста на 3.15 но он не решает нихуя
> Один из паттернов же не помню какой. В контексте висит карта<string, object> со всеми сервисами, и ты по имени получаешь нужный.
Не совсем, там какая-то хуерга для ленивой инициализации, но если упростить — то можно считать, что там просто ассоциативный массив.
А LayoutInflater так вообще как поле класса хранится.
...
map.put(key, Long.valueOf(0))
Почему линт подсвечивает с unnecessary boxing? Нельзя же просто нуль передать?
Да, в курсе. Но он не находит put(String, int), если просто ноль дать. Мне как-то особым образом инициализировать нужно?
О, спасибо.
Еще один довод почему ненужно идти в чат в телеграмме.
Я думал посимвольно сдвигами сделать, но что-то таксибе вариант. Порезанный SHA/MD5? CRC32? Присваивать самому и хранить мне лень. Как лучше?
Можно лонги рандомайзером генерировать.
Вроде подходит, спасибо.
Если айдишники уникальны во время выполнения — завести переменную и инкрементировать её. Если всегда уникальны — порезанный md5/sha или вообще самому считать хэш строки. Вариант с отсутствием уникальности уже предложили.
java.lang.IncompatibleClassChangeError: The method 'java.io.File android.support.v4.content.ContextCompat.getNoBackupFilesDir(android.content.Context)' was expected to be of type virtual but instead was found to be of type direct
На стек не посылай, я думал здесь кто-то сталкивался с таким. Не хочу под firebase все в мыле переделывать.
Кхм, попробуй, спасибо.
могу ли продолжить юзать gcm, и забить на новомодный firebase? зачем он нужен вообще?
файрбейз круче чисто внешне, да и кода поменьше будет. Всё интуитивно.
Я могу иметь несколько разных файлов(настроек) SharedPreferences для всего приложения и иметь к ним доступ из любой активити или фрагмента. А так же иметь несколько разных файлов(настроек) SharedPreferences для любого конкретного фрагмента или конкретной активити.
Уважаемый пердун напомните мне про GCM:
1) Можно ли рассылать пуш всем юзерам, без указание конкретных senderId (или как там)?
2) GCM может сам показывать нотификаций "по умолчанию" или нужно обязательно Notification создавать и вызывать NotificationManager.show(...)?
3) Насколько увеличивается размер APK?
>>757815
SharedPreferences уникальны по имени в рамках одного приложения.
Формально это xml файлы в папке /data/data/<package name>/shared_prefs/ с именами которые ты передаешь в getSharedPreferences(...)
По хардкору.
Теперь немного меньше кода.
Все остальное такое же примерно.
ГСМ работает как и работал.
Даже сделали миграцию с ГСМ на файербейс.
Сохранение в них идет последовательно или параллельно?
Например, у меня есть такой некий код, который где-то в сервисе шлет через PendingIntent сообщение, а потом в onActivityResult оно обрабатывается так:
if(requestCode==ACTIVITY_AGENT_CODE && resultCode==KILL_PROCESS_CODE)
{
SharedPreferences.Editor editor= prefs.edit();
editor.putBoolean(IS_ACTIVITIES_ALIVE,false).apply();
editor.putBoolean(YPS_KILL_ORDER,false).apply();
android.os.Process.killProcess(android.os.Process.myPid() );
}
В результате IS_ACTIVITIES_ALIVE и YPS_KILL_ORDER часто так и остаются true, а вместо xml файла лежит такой же, только bak.
Как мне сделать, чтобы данные таки сохранялись в SharedPreferences перед killProcess? (его убирать нельзя, он нужен)
А еще, какая разница между
android:process=".updater"
и
android:process=":updater"
в манифесте? Вроде, и то и другое сделает сервис отдельным процессом. Или нет?
> Как мне сделать, чтобы данные таки сохранялись в SharedPreferences перед killProcess?
Использовать commit вместо apply.
Есть какой-то смысл делать apply несско раз друг за дружкой?
> android:process=".updater"
Там как-то не совсем понятно про процесс с двоеточием. Мне видится так: двоеточие делает новый процесс приватным для твоего приложения. То есть если ты делаешь какую-то вундервафлю из разных приложений, которые шарят между собой процессы, :update запущенный в одном не будет пересекаться с :update запущенным в другом. В рамках одного приложения я даже не знаю есть ли практическая разница, но гугл советует ставить двоеточие. Позапускай и посмотри как оно распределяется по пидам или вроде того.
а сервисы типа дофига экзотика ?
липовый скайп слеплю вечерком, поучишь ?) Я бы не отказался от небольшого пояснения за mvp и за пару тонких на мой взгляд моментов
Я написал кровлер для сайта-магазина (который не принадлежит мне), который собирает с него инфу и скидывает в бд на сервере. У бд есть рест-морда, к которой подключается приложение. При этом в приложении показываются и названия товаров, и их изображения. При этом в самом приложении покупки совершать нельзя, оно просто перекидывает на сайт.
Каким образом мне все это оформить в сторе, чтобы меня не пидорнули за нарушение авторских прав?
Ясен фиг, что полно туториалов на тему BT LE, но всё это только для приложений уровня hello world годится.
К примеру есть у сервиса метод do_action(), который юзер вызывает по нажатию кнопки и в итоге, если сервис еще не забиндился - получим NPE или не произойдёт ничего.
Как с этим бороться?
Цеплять обработчик на кнопку только когда сервис забиндится, очевидно же, или делать ее кликабельной только после onBind, а до того момента кнопка должна быть тусклой.
Не юзать реалм.
Попробуй так:
final RealmResults<A> result = realmInstance.where(A.class).equalTo("b", c).findAll();
realmInstance.beginTransaction();
result.clear();
realmInstance.commitTransaction();
>это чувство когда использовал реалм в проекте на который забил хуй, так как тебе заплатили и вы разошлись, и там версия 0.88
Расскажите, а как такое возможно, что сервис при нажатии на кнопку не будет забинден? Если я бинд делаю в onCreate, запуск и соединение — быстрая операция, сервис 100 раз успеет забиндиться, прежде чем пользователь нажмёт на экран. За исключением, быть может, ситуаций, когда сервис в другом процессе находится, но тут я понимаю уже.
Ну вот googleApiClient хоть и не сервис (но внутри то там он есть), но как-то коннект не иногда происходит, возможно и у сервиса тоже что-то такое может случится.
Ну, этот сервис в другом процессе находится, поэтому соединение может долго происходить.
> новых версий сдк с чейнджлогами, новых версий популярных библиотек
https://github.com/ben-manes/gradle-versions-plugin
Это не подходит, к сожалению. Нужно что-то более удобочитаемое, чем простое указание, что именно обновилось. Чтобы указаны самые важные изменения, описаны новые плюшки и т.д.
Щас бы чейнджлоги каждый день по двадцать минут читать, в которых инфа о том, что теперь функция, которую ты не использовал, может принимать в качестве параметра новый объект, о существовании которого ты не догадывался. Или пытаться, например, понять по чейнджлогам, чем же ретрофит 2 выгодно отличается от предыдущей версии.
Читаю сейчас Java Concurrency in Practice 2006 года. Еще туторилы здесь http://docs.oracle.com/javase/tutorial/essential/concurrency , но дошел до использования всяких java.util.concurrent.locks.ReentrantLock, Executor Interfaces и охуел, мне кажется такое уже надо всяким мидлам и сеньорам знать.
Посмотри курсы вандербильтского университета на курсере, можно не все, а первые 4-5 лекций. Каждая по полтора часа где-то.
Алсо, жабадоки тут нерелевантны, потому что чистая жавамногопоточность в андроиде вообще не используется, максимум - простенький new Thread(new Runnable()).start(); А для многопоточности используются Handler+Message или AsyncTask
https://www.coursera.org/course/posaconcurrency
https://www.youtube.com/channel/UCt-Wvc_ojTzGLpjhruIXYSw/videos - поиск по Concurrency
>>758821
>Как там в 2010-м?
А что у тебя, в 2016м? Rx? Так это сторонняя либа.
Аноны, опять про MVP, допустим есть типичный пример: список итемов и детализация, т.е. активити с двумя фрагментами в ландскейпе, и с одним в портретной ориентации.
Как лучше реализовать тут MVP? Два презентера под каждый фрагмент? Тогда как заменять фрагменты? Сделать, чтобы фрагменты вызывали сами методы активити, и она уже сама решала че делать, это норм вариант? Или один презентер под активити, который будет отвечать сразу за два фрагмента?
static Activity activity=this;
где-нибудь в onCreate... Но после того как многократно поймал так NPE, больше не хочется.
Суть вообще такова, что есть BroadcastReceiver, который принимает 2 сообщения. Поймав первое он должен будет сделать finish, чтобы потухло на экране приложение и создалась видимость мгновенного его завершения. Второе сообщение уже будет немного позже (0.1 .. 2 секунды), и его обработка будет уже реально завершать работу. Но чтобы receiver пережил finish, он должен быть static, а в static нет доступа к activity. Вот эта рефлексия:
http://stackoverflow.com/questions/11411395/how-to-get-current-foreground-activity-context-in-android/28423385#28423385
выдает пустой Map, например. Но должен же быть какой-то менеджер или еще что-то, чтобы получить доступ к стеку, правда же?
Ну хоть бы в early access
Слишком абстрактно расписал давай конкретнее. Так могу только сказать, что два презентера не нужны по определению MVP.
>чтобы фрагменты вызывали сами методы активити
Только если коллбэки. Фрагмент не должен иметь доступ к родительской активити.
>>758828
А если не статик ресивер сделать (бля, что это вообще за чудо), а просто интентсервис запускать? Он сделает работу, какую надо, и умрёт. А активити завершишь сразу, на это пофиг.
Ты хуйню какую-то нагородил.
>два презентера не нужны по определению MVP
почему?
мне понравился ответ тут https://toster.ru/q/225663 с двумя презентерами, что скажешь?
А, это другое дело. Мне показалось, что ты решил лепить по презентеру для каждого фрагмента, тем самым нарушая саму концепцию мвп. Если презентер слой будет независимо от масштаба приложения предствлен только двумя классами, каждый из которых делает свою работу, то это норм.
>каждого View
Ну что давайте хуярить для всех вьюх по презентеру? Для каждого текствью?
Чего еще, добавить даже не не знаю.
Ммм, бесполезные классы, вкуснаа. У меня сейчас проект на 50к строк, всё запихано в один презентер класс (строк 800 где-то), и при обновлении данных он просто уведомляет подписавшиеся на обновления фрагменты (просто паттерн обсервер с регистрацией на onAttach). Далее фрагменты получают уведомления, вместе с int кодом, который определяет, что именно было изменено, и если полученный код им важен, то они обновляют соответствующие вьюхи. У меня сейчас порядка 30-40 разнородных фрагментов и все они прекрасно работают по такой системе. Если бы я для каждого фрагмента делал бы презентер, я бы застрелился.
Ага, вот стало и понятно, в чем твоя проблема: ты не отличаешь View как компоненты архитектуры от класса android.view.View.
По твоей логике для каждого фрагмента должен быть презентер, теперь если упустить фрагменты и заменить их на фловы допустим у тебя будут твои кастомные вью с разделением которое ты скажешь. И да это может быть 1 текствью, теперь вопрос, как остановится и перестать плодить ненужные вьюхи?
>>758854
Детектор чини.
> Далее фрагменты получают уведомления, вместе с int кодом, который определяет, что именно было изменено, и если полученный код им важен, то они обновляют соответствующие вьюхи
Да это же обычный eventBus, который все обсирают.
Я другой анон, так а куда ты вынес запросы например? Фрагменты же юзают разные запросы например по нажатию на кнопку а у тебя выходить один презентер со всеми листенерами?
Бля, ладно. Разрешаю тебе ебаться дальше с кучей презентеров, а сам пойду попрограммирую вслать на полуавтоматизированном коде.
>>758861
Фрагменты по нажатию на кнопку отправляют каллбэк в активити, и та что-то делает. Либо формирует запрос на сервер (я использую ретрофит, запрос по коллбэку обычно обновляет мой не-презентер класс, который в свою очередь обновляет фрагменты), либо показывает другой фрагмент и активити (тут вообще не нужно никакого взаимодействия). Напрямую из фрагментов делать вызовы в презентер - зашквар, потом никогда не разберёшься, что откуда вызывается. Максимум - чтение данных из презентера, без изменения оных.
Ящитаю, что в идеале фрагменты должны вообще иметь ноль логики и управляться только за счёт вызовов родительской активити, но у меня в силу некоторых причин (отсутствие дизайна в начале проекта) не получилось это реализовать.
Я о том что у тебя придурка вьюха это фрагмент, т.е. одновременно могут отображаться 2+ вьюх следовательно столько же презентеров будут работать. Такая абстракция ничем не мешает тебе делать презентер на каждый элемент и если начнешь пилить без фрагментов прекрасно это поймешь.
ну не переживай, потом отрефакторишь, когда время будет, станет нормальная архитектура
>Фрагменты по нажатию на кнопку отправляют каллбэк в активити, и та что-то делает. Либо формирует запрос на сервер (я использую ретрофит, запрос по коллбэку обычно обновляет мой не-презентер класс, который в свою очередь обновляет фрагменты), либо показывает другой фрагмент и активити (тут вообще не нужно никакого взаимодействия).
Рили у тебя не мвп, у тебя своя архитектура, твой презентер это практически ивентбас.
>Напрямую из фрагментов делать вызовы в презентер - зашквар, потом никогда не разберёшься, что откуда вызывается. Максимум - чтение данных из презентера, без изменения оных.
Слишком сильное заявление, тебе не кажется? Но так работает mvc если что.
>Ящитаю, что в идеале фрагменты должны вообще иметь ноль логики и управляться только за счёт вызовов родительской активити, но у меня в силу некоторых причин (отсутствие дизайна в начале проекта) не получилось это реализовать.
В идеале нужно делать активити вьюхой и отказываться от фрагментов.
не пробовал... Я пока не очень хорошо с ними знаком вообще. Знаю, что где-то должен лежать зареганный объект, принимать intent-ы и чего-то с ними делать. И что работает он по фильтру-по action. Погуглю манифест, спасибо. Только пока не понимаю как можно откуда-то издалека будет управлять этим Activity.
Все это вообще нужно было, чтобы пока сервис сделает все свои дела, отправит запросы о закрытии приложения и статусы, показать пользователю, что приложение потухло. Это не так, и после того как сервис все отработает, в контексте MainActivity еще надо было штуку одну сделать, но его живой объект уже не требуется. Просто не хочется, чтобы приложение тухло долгое зависящее от соединения время
Никогда
Это не мой подход, даун.
Ты уже обобрался, когда дал понять, что View от android.view.View не отличаешь. Твоё мнение никому теперь неинтересно.
Ну давай, расскажи, как же мне отрефакторить? Неужели разбить на десяток классов, которые будут иметь такую же логику?
Ай в пизду, ты вообще, похоже, не понимаешь в программировании.
>>758874
>Слишком сильное заявление, тебе не кажется
Не кажется. Активити - вью компонент для связи с презентером. Если С презентером связана не только активити, но и фрагменты - это лишние связи в архитектуре.
>Рили у тебя не мвп, у тебя своя архитектура, твой презентер это практически ивентбас.
Хуй с ним, я, конечно, могу спросить, почему мвп исключает ивентбас, но только мне похуй. Я чистую реализацию ивентбаса никогда в жизни не видел и не собираюсь смотреть.
Придурок, это уровни абстракции, я тебе уже привел пример почему ты рахит с несколькими презентерами на экране одновременно.
>разбить на десяток классов
да, где каждый класс выполняет свою работу, для этого и создавали ООП, это, видимо, ты чего-то не понимаешь в программировании
>Не кажется. Активити - вью компонент для связи с презентером. Если С презентером связана не только активити, но и фрагменты - это лишние связи в архитектуре.
Из активити тоже нужно выносить логику, я об этом. А у тебя она как раз в активити.
Просто можно делать мвп с одной активити и кучей фрагментов, тогда презентеры будут работать с фрагментами но это похуй.
>>758885
>Хуй с ним, я, конечно, могу спросить, почему мвп исключает ивентбас, но только мне похуй.
Почему исключает, нет. Просто ты ивентбас презентером называл.
>Я чистую реализацию ивентбаса никогда в жизни не видел и не собираюсь смотреть.
А это ты зря, ладно тут анонимный форум, но в реальности такие слова отметка долбоеба до конца жизни.
Это ты не понимаешь в разработке приложений. Прочитай про SOLID на досуге, много нового узнаешь.
Вы не правы, всего доброго.
>>758890
>А у тебя она как раз в активити.
Ну, я вынес все вызовы к серверу в отдельный класс. В активитях остались только сотни коллбэков от фрагментов, которые обрабатываются в 1-3 строчки.
>>758893
Читал, сложна без примеров. Похоже на пердёж в лужу, который неприменим в реальной жизни.
>Ну, я вынес все вызовы к серверу в отдельный класс. В активитях остались только сотни коллбэков от фрагментов, которые обрабатываются в 1-3 строчки.
дело в том что вызываешь ты эти 3 строчки не там где нужно если следовать патерну.
>Читал, сложна без примеров. Похоже на пердёж в лужу, который неприменим в реальной жизни.
Ладно парни у нас тут неадекват, хватит кормить этого зеленого.
> В активитях остались только сотни коллбэков от фрагментов
Нахуя? Почему фрагмент у тебя сам не выполняет запросы, а в активити вынести только навигацию между фрагментами?
>>758897
Научите солиду, посоны. Киньте примеров. Я вообще-то сюда и зашёл первый раз за дохуя месяцев, чтобы узнать, что там нового в андроиде вышло.
>>758899
Потому что это будет слишком большая паутина и трудноисправляемая вызовов. Активити сравнительно мало (штук 10), фрагментов же штук 50. А если мне захочется один из вызовов как-то поменять?
Вот блядь. Нет бы направить на путь истинный, нет, нахуя, лучше оскорбить и повысить за чужой счёт свою самооценку (вот он не знает солид, а я знаю, давайте-ка я его нахуй пошлю, ай да я молодец).
>>758905
Пиздуй гуглить блять, заебали уже.
Вы блять в поисковик не можете чтоб найти инфу по принципу которому больше лет чем вам и всякий гайдов больше чем вы в свое жизни прочли.
Объясняю: проблема не в том, что ты не знаешь SOLID. А в том, что ты называешь его
> пердёж в лужу, который неприменим в реальной жизни
А на все несогласия со своей архитектурой отвечаешь
> МНЕ ТАК УДОБНО, А ВЫ НЕПРАВЫ
Если ты чего-то не знаешь, то какого хрена ты об этом кукарекаешь тогда? Ты себя только полном долбоёбом так выставляешь.
Бля, я когда работу искал, прочитал сотню книжек, прошёл курс по agile, читал и про solid, и mvp учил, и в жопу носорогу заглядывал. Да только вся инфа, которую я нашёл - субъективна и подходит только в конкретных случаях для маленьких приложений.
>>758915
> пердёж в лужу, который неприменим в реальной жизни
>Читал, сложна без примеров. Похоже на
>А на все несогласия со своей архитектурой отвечаешь
Ну, посоветовал мне человек разбить одиноднородный класс на 10 классов, хуй пойми зачем. Ну да, я не согласен. И да, он не прав. Хорошо, если именно это является причиной твоего недовольства, то мне нет повода расстраиваться.
Бамп.
Ну ладно, а если отвлечься от receiver-а и прочего. Разве нет какого-то обращения к системе, чтобы получить back-stack или объекты Activity? Мне кажется, это настолько же естественное действие, как получить какой нибудь очередной системный manager
Ты в любом случае соснешь, потому что по хардкору решение на какую вью переключать должен принимать онли презентер, грубо говоря ифы должны быть не в самой активити, а в презентере, но какая конкретно сейчас чайлдвью отображается ты узнать из презентера не можешь, короче нахуй и в пизду. Скорее всего скоро набегут синьйоры с 1ккк в минуту и обзовут меня неосилятором и позором профессии.
вот вкотился в IT мир, и понял что это какая болезнь в этой сфере. Люди ну прям очень трудны в общении, что-то сказать другое, что не соответствует мнению человека невозможно. Шлют сразу нахуй, начинают обсмеивать. Эта некая свобода собенно фрилансеров просто губид пиздецки. Твой пост идельно всё описывает. Вобщем схоронил скрин...
// TODO remove this stub when #taskref is done
и чтобы студия это как-то понимала, автодополнение там или еще чего.
Плагин поищи. Думаю есть такой с синхронизацией с джирой.
Нет, думаю не нужен. Я в общем более-менее разобрался.
Я плохо помню свои мотивы. Обычно я использую эту строку, чтобы одно значение написать. А тут два пришлось, так что было ctrl-c/ctrl-v
Вообще надо получше понять разницу между commit и apply, потому что внедрив это, у меня и проблемы с многопоточностью решились, хотя целый день до этого пиал обходные пути по этой причине. Спасибо, кстати, большое
Я уже не помню почему стал писать через точку. Пробовал и тот и другой вариант, разницу почти не понял, но через точку было чем-то лучше. Кажется, через двоеточие дох вслед за процессом приложения и процесс сервиса, хотя они и должны были быть независимыми. Уже не помню
> Вообще надо получше понять разницу между commit и apply
Commit сразу пишет в файл, apply не сразу.
> Вообще надо получше понять разницу между commit и apply, потому что внедрив это, у меня и проблемы с многопоточностью решились, хотя целый день до этого пиал обходные пути по этой причине. Спасибо, кстати, большое
Прочитай джавадок и поймёшь в чём разница. Один метод — синхронный, другой — нет.
Мимо энтерпрайз-примат
Мне в каждом контроллере его вручную инстанцировать? А если мне синглтон нужен. Или это фабрика
Тебе что-ли нужно Dependency Injections?
Тогда бери Dagger2, Dagger или RoboGuice если он еще жив.
А зачем ещё что-то? Я себе сделал в несколько строк обертку чтобы тайм-аут был и все
Ты про системные сервисы, которые возвращает getSystemService, или android.app.Service, или о чем-то другом?
хватит траллить
Какие инструменты есть для этого?
Чем меньше включен экран тем меньше тратиться батарея. Для этого асинхронщина.
Шо на каникулах нечем заняться?
Пиздуй в фурряч.
Я никогда не устраивался и не работал андроид-разработчиком и не знаю, как там всё принято.
Тестовое задание:
Необходимо сделать приложение для поиска пользователей на github (https://developer.github.com/v3/search/#search-users)
Дизайн как в гугл плей, т.е плавающее окошко поиска в верхней части экрана, которое уезжает по свайпу вниз и выезжает по свайпу вверху (независимо от уровня прокрутки вниз, см. гугл плей). Внизу recyclerview с списком найденных пользователей. Поиск из плавающего окошка, по мере ввода символов.
Желательно использовать следующие инструменты и библиотеки: RxJava, Retrofit, Support library, Realm
Неплохо, но ничего особенного.
Хотя лично мне нравиться такая компоновка model/service/activity.
Я еще модельки сделал бы immutable (раз делаешь с упором на функциональщину).
Вот https://timboudreau.com/blog/json/read сайт генерит Java класс из JSON без сеттеров.
Ну и написал бы на котлине конечно.
Из минусов: нет обработки ошибок, нет обработки слишком частого ввода нет realm, хотя в пизду его.
>>760140
Спасибо за отзывы, обработку ошибок добавил. В таком задании ожидаются подробные комментарии и юнит тесты? Хотел добавить, но толком и нечего комментировать и тестировать.
>нет обработки слишком частого ввода
Это как реализовать? Я RxAndroid не пользовался никогда до этого. Добавить в:
users.subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<Users>()
строчку:
.throttleLast(500L, TimeUnit.MILLISECONDS)
Чтобы обрабатывал последний запрос после которого прошло 500мс?
Тебе нужен либо PublishSubject c debounce, в который ты будешь передавать текст из колбэка, либо использовать RxSearchView с тем же debounce.
Да и хули ты тупишь, это самый каноничный пример использования Rx, хоть копипасти себе весь проект у какого-нибудь хипстера на medium.com
Ну вот пусть у меня был токен ZW1haWw6IG11ZGFrQG1haWwuY29tIHBhc3M6IHBvYzEzNGF6YUxPWA==, с ним я делал всякие запросы, отправлял его в хедерах, а потом юзер нажал logout, значит надо перестать этот токен сувать в хедеры. Значит надо его стереть, вот и возникает вопрос - где и как его хранить, цеплять то понятно что в билдере прицепить интерсептор.
Что-то как-то сомнительно, если так, то interceptor'у нужен будет доступ к SharedPreference. Не будет ли он с диска каждый ебаный запрос читать? Оно-то конечно в отдельном потоке, но все же.
Зато не сотрётся при закрытии процесса приложения. Я сделал так, мне норм.
А для реализации подобной фигни в ретрофите (а точнее в OkHttp) нужно сделать кастомный CookieStore и установить его в сессию через функцию setCookieJar.
мимо
>>760260
Вообще, если напрячься, то можно сделать что-то типа подгрузки из sharedPreferences при иниализации сессии и дальнейшее хранение в переменной типа Map (как в дефолтной реализации CookieStore), если смущает постоянное обращение к SharedPreferences (хотя я не пойму, чего в этом плохого)
>>760264
Действительно, при смерти процесса может хуйня случится, ну раньше я и в переменную писал и в SharedPreference и при открытии приложения смотрел есть ли валидный токен, если был, то восстанавливал его. Посмотрим на этот кукистор.
Сорри, я тупанул немного. Мне почему-то показалось, что ты в кукисах токен передаёшь. Если он отдельным хедэром, то можно в интерсептере передавать, как ты и делаешь, просто стирать при логауте из преференсов.
Просто в OkHttp в интерсепторах нельзя передавать кукисы, они перезаписываются, поэтому мне пришлось велосипедить. К тебе это не относится, забудь.
> Не будет ли он с диска каждый ебаный запрос читать?
Не будет, ведь шаред преференсы кэширующие в памяти.
Тогда заебись вообще.
Очень старые сервисы у вас батенька. Уже 9 вышли. Боюсь проект нужно переделывать под новые. Но тут я смотрю вообще говно динозавра, если обратить внимание на способ подключения facebook'a и actionbarsherlok/
Ящитаю тоже, но основу для этого не имею, точнее имею, но учитывая мое незнание того как на самом деле работают базы, эта мысль вряд ли верна.
Окей, спасибо.
Можно создать временную таблицу, заполнить ее айдишниками и SELECT... JOIN...
42% Я ебу что ли ты задачу вообще не описал.
Только учти что у SQLite есть ограничение на размер текста запроса.
Clojure оффкозз, в будущем все будем писать под мобилки на ClojureScript + ReactNative
А задача важна? Ну записей ~500 с 7 полями, айдишники в них это BaseColumn._ID primary key, как-то получаю список 10-50 этих айдишников, и нужно вытащить что-то с данными сделать.
Я уже решил делать на where in, но если джоином 100% лучше, то запомню на будущее.
Haskell, Perl, Verilog. Так или иначе пригодится.
Не связывайся ты с Android "сервисами" пока этого явно не потребует бизнес-задачи.
Меньше нахлебаешся с фрагментированностью/"изменением поведения" его API.
Вот так майндфак ты тут разводишь.
Bill Phillips, Chris Stewart, Brian Hardy, Kristin Marsicano - Android Programming: The Big Nerd Ranch Guide (2nd Edition) - 2015 - Вот эту прям вообще все хвалят, добавьте в шапку, если кто читал и может подтвердить, годно или нет.
Потому что есть разные способы подачи информации. Одним удобно учиться по одной книжке, другим по другой, 3-м вообще по видеоурокам.
> неосилил
Печаль, я думал там что-то интересное чего нет офф. доках.
>>761005
> Нахуй такое будущее.
Чому?
Clojure язык богов + в ReactNative работаешь с нативным UI (это тебе не парашный фонгап с JS).
>офф. доках
>Clojure язык богов + в ReactNative работаешь с нативным UI (это тебе не парашный фонгап с JS)
А вот и илита /pr подъехала, с охуительными историями, ясно.
С другим другом общались, он сказал, что то у первого телефон странный, херня какая-то. Ну, я написал тогда такой код:
http://pastebin.com/PziFL1s2
Просто чтобы проверить что прочитается. На одном моем устройстве работает хорошо. На другом выдает или карту памяти, или другое хранилище, если карта отсутствует. А друг так вообще сказал:
"крешится при открытии"
Нихрена не понимаю в чем дело
После onDestroyView мне о созданных вьюхах нужно забыть? Или стоит делать if (mTextView == null)... в onCreateView?
@Inject{R.id.textview}
TextView mTextView
и чтобы этим функционалом всё и ограничивалось.
>>761260
Быстрее самому затестить:
if (mTextView == null)
Log.i(TAG,"обнуляется");
else
Log.i(TAG,"не обнуляется");
и попрыгай по вьюпейджеру
>самый компактный и удобный фреймворк для автоматического определения вьюшек
Butterknife
@Bind(R.id.huy)
Huy pesda
в onCreate
ButterKnife.bind(this);
Спасибо.
Тка я прыгал, они не нулятся, я ведь их нулями не забивал в onDestroyView. Просто думал адекватная ли это вообще практика что-то делать с вьюхами после onDestroyView фрагмента. Доки только говорят, мол, освободить ресурсы относящиеся к вьюхам в ондестройвью.
Ты, возможно, просто недалеко прыгал, потому что вьюпейджер не всегда уничтожает фрагмент при смене страницы, это зависит от используемого адаптера. В каком-то адаптере сохраняются 1-2 соседних фрагмента, в каком-то сохраняются все.
Анон, я все стадии логировал, обычный (не StatePager) адаптер просто делает onDestroyView табам, которые дальше +1 с обеих сторон. Думаю все же можно реюзать созданные вьюхи, ведь пересоздавать стоит только когда это имеет смысл для логики фрагмента.
Просто боюсь если вдруг не знаю какую заковырку, которая потом встанет боком.
Android DataBinding, мне зашло на отлично.
> Кто знает как получить папку карты памяти
Просто забей. Это анальная боль еще та, ведь то, что возвращается Environment.getExternalStorageDirectory() задается производителем девайса. Если он ленивый ублюдок и сделал еще внутренней памятью первый слот под флешку а второй доступен для пользователя, то тебе будет возвращаться именно первая внутренняя память.
И лечится это только костылями уровня проверки монтированных каталогов в /mount.
А на 4.4 ты вообще туда хуй че запишешь.
Ну с китката уже завезли документ провайдер, а на лолипопе он уже вменяемый. Только вот на некоторых китайцах его нет, такой-то лол. А до него только ебля: http://stackoverflow.com/questions/11281010/how-can-i-get-external-sd-card-path-for-android-4-0
Asm, brainfuck, f#
Никто не хочет давать не гарантированное решение, потом еще хуями закидают.
что тебе именно надо совместить?
Берешь и оборачиваешь колбэк в Observable.create.
>Просто забей
Ну как тут забить, если мое приложение работает с пользовательскими файлами... На карте они или где-то еще - не так принципиально. Просто нужен проводник по местам, где эти файлы могут оказаться (скорее всего, они были переброшены с ПК, и пользователь ожидал использовать их через всяке приложения). Но если все будут игнорировать эти носители, то что, скоро не останется плееров, файл-менеджеров, галерей, читалок? Как они работают, и на каждом устройстве? Или в каждом файл-менеджере написана тысяча костылей, чтобы он мог везде работать? Я просто думал, что андроид позиционируется как платформонезависимая система. Иначе бы в требованиях писали, что нужен не 4.2 андроид, а самсунги такие-то, соньки такие-то и т.д.
> самый компактный и удобный фреймворк для автоматического определения вьюшек?
Что же вы юродивые какие, на вот мой (написал за 5 минут):
пик 1 - фреймворк
пик 2 - пример использования (просто тип и типов в дженерике)
Писать надо на нормальных языках.
Это как пример захотелось самому такой написать.
Для себя я юзаю собственный DSL для связки UI и MVVM, общий для Android/iOS.
В итоге кода получается столько же как с кодогенераторами.
Ты себе не представляешь, как ты меня бесишь этим италикболдом. Перекатывай тред давай лучше
А как ты под гейос ебашишь?
>Сервер
>присылать svg-картинки
Вы там ебнулись? Нихуя у тебя работать не будет. Если это иконки действий то засунь из сразу в апк. И студиия сможет сконвертить их в png, сможешь ограниченно пользоваться ими почти как vector-drawable до лолипопа. Но смысл в том что она сгенерит фолбэк из пггшек при сборке, а никак не в рантайме.
> Просто забей. Это анальная боль еще та, ведь то, что возвращается Environment.getExternalStorageDirectory() задается производителем девайса. Если он ленивый ублюдок и сделал еще внутренней памятью первый слот под флешку а второй доступен для пользователя, то тебе будет возвращаться именно первая внутренняя память.
Это нормальная ситуация. External Storage был картой памяти лет 5 назад, сейчас это всегда внутренняя память для свободного использования.
Продолжение истории.
Прошлый код хорошо пошел на моих устройствах, на устройстве первого друга выдал внутреннюю память, а еще у троих тупо вылетел и не стал запускаться.
Я взялся воплощать понятный моим мозгам способ:
http://stackoverflow.com/a/19831522
В результате, на моих оно по прежнему работает, у первого друга вылетает с ошибкой, а от второго ответа пока нет. Ошибка в последнем коде у первого друга совпадает с ошибкой в первом коде у остальных:
java.lang.NullPointerException: Attempt to get length of null array
http://pastebin.com/hAq7yuAm
Т.е, я получил Environment.getExternalStorageDirectory(), который был не null
Потом я получил его родителя rootFile, файл по которому существует и не является файлом. Однако rootFile.listFiles() возвращает null, потому что...
>Returns an array of files contained in the directory represented by this file. The result is null if this file is not a directory.
Значит rootFile не файл, не папка. Но что это, мать вашу, такое вообще? Как такое может быть?
> Environment.getExternalStorageDirectory().getParent();
Плохая идея.
> Но что это, мать вашу, такое вообще?
https://en.wikipedia.org/wiki/Inode
> реально ли в ведре юзать svg для иконок
Реально, но лучше не надо.
compile com.caverock:androidsvg
Меня интересует вопрос, можно как-нибудь захватить изображения с телефона и передать на компьютер, без установки на компе IDE?
Что-то не гуглится ничего по этому поводу.
Сделать скриншот - обычно кнопка питания + кнопка громкости вниз.
https://developer.android.com/studio/command-line/shell.html?hl=ru#screencap
Качаешь отдельно adb и делаешь.
Это копия, сохраненная 21 июня 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.