У нас в университете за слово «оптимальный» баз постановки задачи оптимизации сразу на пересдачу отправляли. На самом деле здесь приведены просто эвристические наблюдения, возможно, приводящие к победе с бОльшей вероятностью, чем игра наугад, но, как мне кажется, не с максимально возможной вероятностью.
Насколько я понял из объяснения — там просто затирается кусок памяти, где расположено начало программы, для того чтобы освободить память для дальнейшей работы:
temporary storage is allocated that deliberately overwrites the beginning of the program, smashing its initialization code to save space
Или я не прав? Довольно интересный способ освободить память =)
Речь, конечно, идёт об Адроид приложениях в которых помимо Java используется, например, C++ (Android NDK). Сейчас поддержки C++ сорцов нет, даже на минимальном уровне — приходится пользоваться Eclipse паралелльно с IDEA (там, кстати, с этим всё в порядке).
1. Любой сервис либо локальный, либо удалённый. Локальный нужно байндить, удалённый — нет.
2. Возникает вопрос — зачем всё усложнять? Зачем пихать сервисы, если они не нужны? В статье я описал два случая, когда действительно нужно использовать сервис — всё остальное только усложнение кода программы.
3. IntentService как вы написали работает только на одном потоке, помимо этого:
3.1. Неизвестно если очередь потоков
3.2. Нельзя отменить работающий таск
3.3. Нельзя проверить работает ли таск
3.4. Нельзя норамыльным образом передать результат работы (LocalBroadcastManager больше похоже на костыль)
3.5. Да и вообще — зачем он нужен? Вы используете какую-нибудь функцию сервиса для работы вашего бекграунд таска?
На самом деле всё что я хотел сказать это то, что Андроидные сервисы — это НЕ решение задачи управления тасками в бекграунде как многие думают.
Я решил закончить дискуссию в этом треде и написал статью о ненужности сервисов для решения бекграунд задач в Андроиде (за исключением двух случаев). Линк (к сожалению, пока только на английском языке).
1. Для того чтобы что-то подменять при повороте нужно это что-то сначала сохранить в область не связаную с Activity, так? Вопрос такой: где у вас хранится AsyncTask?
2. Про IntentService — зачем усложнять жизнь? При использовании сервиса вы столкнётесь с такими проблемами — как передать не serializable объекты (тут имеются ввиду и parcelable и aidl compatible)? Как синхронно «привязать» (bind) локальный сервис? И что самое интересное — вам всё равно придётся использовать ExecutorService (потому что сервисы работают на main потоке).
Тогда каким образом вы view обновляете? Есть два способа: либо вы передаёте views (или Activity) внутрь AsyncTask, либо вы делаете внутренний анонимный класс (и захватываете Acitivity и views неявно). При повороте экрана activity убивается, это значит, что вы должны либо убить таск либо подменить activity в работающем таске. Первый способ плох тем, что вам придётся стартовать новый таск, второй — тем что он сложнее реализуем (нужно где-то хранить ссылку на task и т.д. — в это случае проще и правильнее написать, вообще, своё решение на зависящее от AsyncTask).
PS Не поймите меня не правильно — я полностью поддерживаю open source в общем и вашу библиотеку в частности. Просто указал на проблему, с которой сам недавно столкнулся и которая может проявиться при использовании вашего расширения андроидного AsyncTask'а.
Вы же знаете, что AsyncTask не рекомендуется использовать для тяжёлых задач (link)? Зачем тогда нужен progress для него? (У вас, кстати, как минимум утечка контекста + проблема с восстановлением таска при умирании активити (поворот экрана))
Правильное решение — используйте thread executor и future task, при рестарте активити — проверяйте выполняется ли таск. У меня уже есть готовое решение, но я его пока не залил в свой репозитарий, скоро будет.
PS Я на ваш репозитарий натыкался не раз — в целом мне понравилось, так что продолжайте.
Добавлю свои 5 копеек: вот уже более двух лет я пишу под Андроид и за это время накопилось куча «библиотечного кода». Всё это выродилось в библиотеку (исходники — github.com/serso/android-common, maven зависимости — org.solovyev.android.*).
В библиотеку входят такие вещи как billing, lists (удобная работа с ListView), views (DragButton, SideBar, диалоги настроек), fragments, database, preferences и т.д.
К сожалению, мануала нет, но, надеюсь, что когда-нибудь появится. Примеры использования можно посмотреть в модуле samples и, например, здесь github.com/serso/android-calculatorpp.
AdBlock вешает себя proxy для сети и прогоняет через себя весь трафик вырезая рекламу (собственно, правка hosts позволит только рекламу по имени хоста остановить, по ip же не получится).
1. Я бы сказал, что это зависит от того, какой системой контроля версий исходного кода вы пользуетесь. В Perforce, конечно, будут проблемы, а вот в Git — всё довольно гладко проходит (почти всегда автоматичесуий мёрдж с минимальной работой программиста).
2. QA тестируют только главную ветку (master/HEAD/production)
3. Сборка CI идёт только для главной ветки (master/HEAD/production)
Или я не прав? Довольно интересный способ освободить память =)
1. Отсутствие поддержки Perforce/TFS
2. Отсутствие поддержки нативных исходников
1ую проблему мы решили покупкой Ultimate Edition, а вторая до сих пор остаётся открытой.
Будет ли поддержка 1ого и 2ого пункта в Android Studio?
2. Возникает вопрос — зачем всё усложнять? Зачем пихать сервисы, если они не нужны? В статье я описал два случая, когда действительно нужно использовать сервис — всё остальное только усложнение кода программы.
3. IntentService как вы написали работает только на одном потоке, помимо этого:
3.1. Неизвестно если очередь потоков
3.2. Нельзя отменить работающий таск
3.3. Нельзя проверить работает ли таск
3.4. Нельзя норамыльным образом передать результат работы (LocalBroadcastManager больше похоже на костыль)
3.5. Да и вообще — зачем он нужен? Вы используете какую-нибудь функцию сервиса для работы вашего бекграунд таска?
На самом деле всё что я хотел сказать это то, что Андроидные сервисы — это НЕ решение задачи управления тасками в бекграунде как многие думают.
2. Про IntentService — зачем усложнять жизнь? При использовании сервиса вы столкнётесь с такими проблемами — как передать не serializable объекты (тут имеются ввиду и parcelable и aidl compatible)? Как синхронно «привязать» (bind) локальный сервис? И что самое интересное — вам всё равно придётся использовать ExecutorService (потому что сервисы работают на main потоке).
PS Не поймите меня не правильно — я полностью поддерживаю open source в общем и вашу библиотеку в частности. Просто указал на проблему, с которой сам недавно столкнулся и которая может проявиться при использовании вашего расширения андроидного AsyncTask'а.
Правильное решение — используйте thread executor и future task, при рестарте активити — проверяйте выполняется ли таск. У меня уже есть готовое решение, но я его пока не залил в свой репозитарий, скоро будет.
PS Я на ваш репозитарий натыкался не раз — в целом мне понравилось, так что продолжайте.
В библиотеку входят такие вещи как billing, lists (удобная работа с ListView), views (DragButton, SideBar, диалоги настроек), fragments, database, preferences и т.д.
К сожалению, мануала нет, но, надеюсь, что когда-нибудь появится. Примеры использования можно посмотреть в модуле samples и, например, здесь github.com/serso/android-calculatorpp.
Сколько людей — столько мнений.
нужно отредактировать файл /opt/GuitarPro6/gp-launcher.sh:
Бага на launchpad: bugs.launchpad.net/ubuntu/+source/ia32-libs/+bug/781870
2. QA тестируют только главную ветку (master/HEAD/production)
3. Сборка CI идёт только для главной ветки (master/HEAD/production)