Сейчас испытывал компонент в полевых условиях — опасения по поводу вызова invalidate() из onDraw(…) подтвердились:
выполнив пересчет и отрисовку, компонент сразу же принимается повторить это действие и так продолжается непрерывно.
Отрисовка, конечно, получается плавная, но при этом употребляется 700 МГц процессора, телефон быстро расходует энергию и тормозит даже шторка уведомлений. А еще это, пожалуй, первый раз, когда мой Galaxy Nexus начал ощутимо нагреваться.
Исправить это достаточно просто: далеко не всегда нам нужно обновлять таймер непрерывно. Здесь нужно учитывать то, сколько времени должно пройти для того, чтобы изменение было визуально заметно. Например, мы запускаем в этом компоненте отсчет 5 секунд на планшете с высоким разрешением, тогда есть смысл делать непрерывное обновление. Или это таймер на два часа на телефоне с низким разрешением. Мы можем выполнять хоть 10 перерисовок в секунду, но визуально они заметны не будут.
Вы перепутали ссылку на источник и забыли пометить пост как перевод.
Мое предположение строится на этом ответе со StackOverflow ( http://stackoverflow.com/a/7197867/1219241 ), который полностью повторяет ваш код и которым я сам пользовался несколько дней назад.
Чуть улучшенный вариант (соблюдены соглашения о именовании, а «arialTypeface» не захардкорено = в любой момент можно использовать любой шрифт, не добавляя в код лишний «private static Typeface ...»):
public static final HashMap<String, Typeface> sTypefaceCache = new HashMap<String, Typeface>();
public static final Typeface getTypeface(AssetManager mgr, String path) {
if(!sTypefaceCache.containsKey(path)) {
Typeface tf = Typeface.createFromAsset(mgr, path);
sTypefaceCache.put(path, tf);
}
return sTypefaceCache.get(path);
}
Давно использую шаблоны для Android-разработки, почерпнул немного нового из статьи.
От себя могу добавить простенький шаблон:
Log.i("Invoked", "" + this);
Теперь, когда нужно быстро проверить проходит ли приложение через некоторую точку, сколько раз, когда и сколько времени проходит между посещениями этой точки, нажимаю Ctrl + Space и пишу «log_inv».
Разумеется, использовать это стоит только при разработке и не оставлять лишних логов в приложении.
Продал людям неработающий антивирус? — Какой молодец, не пилил же грант в сколково за чужое изобретение 10 летней давности
выполнив пересчет и отрисовку, компонент сразу же принимается повторить это действие и так продолжается непрерывно.
Отрисовка, конечно, получается плавная, но при этом употребляется 700 МГц процессора, телефон быстро расходует энергию и тормозит даже шторка уведомлений. А еще это, пожалуй, первый раз, когда мой Galaxy Nexus начал ощутимо нагреваться.
Исправить это достаточно просто: далеко не всегда нам нужно обновлять таймер непрерывно. Здесь нужно учитывать то, сколько времени должно пройти для того, чтобы изменение было визуально заметно. Например, мы запускаем в этом компоненте отсчет 5 секунд на планшете с высоким разрешением, тогда есть смысл делать непрерывное обновление. Или это таймер на два часа на телефоне с низким разрешением. Мы можем выполнять хоть 10 перерисовок в секунду, но визуально они заметны не будут.
Мое предположение строится на этом ответе со StackOverflow ( http://stackoverflow.com/a/7197867/1219241 ), который полностью повторяет ваш код и которым я сам пользовался несколько дней назад.
От себя могу добавить простенький шаблон:
Теперь, когда нужно быстро проверить проходит ли приложение через некоторую точку, сколько раз, когда и сколько времени проходит между посещениями этой точки, нажимаю Ctrl + Space и пишу «log_inv».
Разумеется, использовать это стоит только при разработке и не оставлять лишних логов в приложении.
onBootReceiver — названия классов начинаются с большой буквы (OnBootReceiver).
Нехорошо использовать строку «android.intent.action.BOOT_COMPLETED», лучше использовать константу Intent.ACTION_BOOT_COMPLETED.
Оно-то, конечно, мелочи, но не стоит приучаться к плохому.
На чем же еще мсьё планировал реализовать подобный функционал?