Pull to refresh
190
0
Арвид Блументал @andrei_mankevich

Google Certified Android Developer

Send message
GIF поддерживается, но плохо. Просто его надо загружать через класс Movie. При этом на многих GIF-файлах при воспроизведении падают нативные ошибки и приложение закрывается. Еще как вариант можно открыть GIF в WebView, но проблемы при воспроизведении некоторых GIF-файлов все равно есть.
Писал свой декодер GIF с использованием NDK, но проблем с ним тоже было не мало. Так что если есть возможность — с гифом лучше не связываться.

Если в анимации кадров много, то через AnimationDrawable конечно не получится ее проиграть. Можно просто по одному загружать кадры, декодировать в Bitmap, отрисовывать и делать recycle. При этом 15-20 fps должно получится.
String s1 = "123";
String s2 = "123";

В этом конкретном случае как раз s1 == s2 будет true. Строка «123» попадет в пул констант и обе переменные s1 и s2 будут ссылаться на одну и ту же строку. Где только про это не написано…
Хм, под Android модно писать IoC фреймворки :)
А можно просто использовать Animation.setRepeatMode(Animation.REVERSE) :)
Ага, а еще лучше вообще сервис использовать для таких целей :)
Ну WeakReference тут лишнее, если уже собрались вызывать cancel. Так что да, можно просто в cancel занулять listener.
Вообще в конце концов вызов метода AsyncTask.cancel заканчивается вызовом Thread.interrupt, который в свою очередь просто выставляет флажок о том, что поток прерван.
Если поток в этот момент заблокирован на методах wait, sleep или join, то поток разблокируется и эти методы кинут InterruptedException. Если поток в этот момент занят чем-то другим и не заблокирован, то InterruptedException бросится сразу при первом вызове wait, sleep или join.

Такая проблема может возникнуть, если плохо написать метод AsyncTask.doInBackground :)
Т. е. так, чтобы он не предоставлял возможность отменить свое выполнение. Например, выполнять в нем какие-нибудь сложные расчеты, которые занимают много времени. При этом вызовов wait, sleep или join не будет. Если периодически не проверять не отменена ли задача и прекращать вычисления, то вызов AsyncTask.cancel ничего не даст.

В случае сетевого запроса скорее всего такой проблемы не возникнет, но лично я бы на всякий случай дополнительно в onStop убирал listener из AsyncTask.
В вызове AsyncTask.cancel никакой магии нет — задача завершится только если это возможно.
AsyncTask.cancel внутри вызывает FutureTask.cancel, который делает вот что:
Attempts to cancel execution of this task. This attempt will fail if the task has already completed, has already been cancelled, or could not be cancelled for some other reason.

Все зависит от того, что происходит в AsyncTask.doInBackground. Нужно удалять listener из AsyncTask, иначе можно получить memory leak.
Ничего себе никакой — а memory leak за проблему уже не считается? :) Пока не завершится выполнение AsyncTask сборщик мусора не сможет собрать MyActivity.
И еще небольшой вопрос :)
Не эксперт в криптографии, но AES же симметричный, ключ должен хранится в приложении — разве его сложно расшифровать?
Ага, ну так понятнее, вы просто считаете, что constant pool — это «logic of our applications» :) Мне кажется, что логика приложения — это все-таки оставшиеся 20-50%, которые приходятся в class-файлах на методы.
Если в цикле складывать миллион строк — то ничего хорошего не получится и без волшебного Stringer Java Obfuscation Toolkit :)
Так а конкретных цифр для Dalvik у вас нет? Есть ли разница между Dalvik и JVM? Все-таки в dex пул констант общий.
Actually Strings is about 50-80% of logic of our applications.

Это вы как так посчитали?
А как вообще дела обстоят с потерей производительности? Все-таки строки приходится расшифровывать в рантайме.
Размещал приложение в LG SmartWorld, Samsung Apps Store и Amazon App Store — суммарно за несколько месяцев установок набралось меньше ста. При этом на Google Play 400k установок.
А LG SmartWorld и Samsung Apps Store мне показалось решили сделать в принципе максимально неудобными для публикации приложений и им это удалось.
Т.е. эта штука за 150$ только строки шифрует?
А dex2jar падает — это не показатель, его пофиксят.
ResultReceiver бьет через процессы

Только если свое приложение работает в нескольких процессах. Иначе будет падать эксепшн в intent.getParcelableExtra, т.к. класс такой не найдет.
Мне кажется r_ii про хэндлер, который передается в ResultReceiver в конструктор, он там действительно для того, чтобы на нем вызывать onReceiveResult, поэтому onReceiveResult будет выполнен в том же потоке, из которого вызвался createIntent. А вообще каждый раз создавать новый Handler там тоже не нужно :)
oDesk Wizard не хватает, функционала, согласен. Но оно для нас успешно, как минимум, нам уже писали из oDesk по его поводу.

Вот как. Ну тогда вполне успешный, особенно если учесть, что аналогов вроде как больше и нет в Google Play.

Часы — демо приложение, для отработки обоев.

Вот это я и имел ввиду — зачем этот hello wallpaper в маркете? :)

Shabbat и Yahrzeit, как ни парадоксально, были нам заказаны, и дизайн пришел от заказчика.

Это жесть. Ну ладно, жираф большой — ему видней :)
Ок, oDesk Wizard вполне себе приложение, но рейтинг в 3.5 говорит, что не такое уж оно и удачное. Хотя не рейтингом единым, конечно. Но Digital Clock Wallpaper, например. Сколько точно таких часов от таких же начинающих разработчиков уже есть в Google Play?

Про Shabbat и Yahrzeit даже не знаю, что написать. Даже если закрыть глаза на то, что два этих приложения недалеко ушли от hello world, оно ведь и работает не очень, судя по отзывам: «Problem is that it has zero accuracy in calculating.»

Дизайнер оформляет кнопочки, иконки и прочую приятную мишуру, чтобы результат смотрелся солиднее.



Вот тут особенно солидно смотрится :) Серые буквы на желтоватом фоне, ну нечитаемо же практически.
У меня такое получается, когда я начинаю заниматься дизайном.
Также сразу устанавливается цель — публикация в магазине приложений Google (ну или Apple, для iOS).

Маркет не жалко?
Судя по средней оценке в 2.2 — пользователи очень рады, что им приходится еще дополнительно качать и устанавливать Ministro :) Зато быстро с Qt портировалось, да.

Information

Rating
Does not participate
Location
Рига, Латвия, Латвия
Registered
Activity