Подготовка LruCache в Appwidget

у меня есть appwidget, который запускает activity, когда пользователь нажимает на него.

В моей деятельности у меня есть gridview, содержащий относительно небольшие Drawables (изображения, потому что рисование может быть больше, чем просто изображения), но пользователь может size их.

Я заметил, что это занимает too Long to size them at runtime when Scrolling trough the gridview.

Я хочу подготовить lruCache только one time в моем appWidget's onUpdate, который вызывается в самом начале, когда пользователь размещает виджет приложения на экране.

Проблема

Когда я определяю lruCache в своем appWidget с помощью

private final int lruCacheSize = (int) (Runtime.getRuntime().maxMemory()/1024);
private LruCache<String, BitmapDrawable> myLruCache;
...
myLruCache = new LruCache<String, BitmapDrawable>(lruCacheSize) {
            @Override
            protected int sizeOf(String key, BitmapDrawable value) {
                // TODO Auto-generated method stub
                return super.sizeOf(key, value);
            }
        };  

Будет ли он существовать только до тех пор, пока существует процесс appWidget? Или кэш-файл из lruCache остается в моем cacheDir моего приложения? Или он будет удален после завершения процесса appWidget? Если он существует в течение всего времени жизни моего appWidget, как я могу получить к нему доступ из своей активности?

Я не хочу каждый раз, когда пользователь нажимает на appWidget, создавать LruCache и заполнять его всеми относительно небольшими изображениями, которые позже понадобятся gridview. Я хочу сделать это один раз, или если пользователь очистит кеш, который будет проверяться каждый час (для экономии заряда батареи).

Вопрос

Как я могу этого добиться? Или есть намного лучший/более простой способ.

Время на самом деле не (if it happens once at the very beginning) Проблема, я уведомляю пользователя о том, что Кэш готовится при размещении appWidget на Экране.

Любая помощь приветствуется.

Обновление относительно CommonsWare ответа

Use Traceview to determine specifically why your implementation is slow.

Прокрутка приложения медленная, потому что я предоставляю три размера (маленький, средний, большой), и я масштабирую их во время прокрутки через мой вид сетки (потому что для масштабирования их один раз при запуске активности потребуется несколько секунд, поэтому я не хочу, чтобы ).

Посмотрите здесь, что я делаю в своем изображении, которое позже покажет рисуемый объект (который является appIcon):

    android:scaleType="fitXY"
    android:adjustViewBounds="true"

Это вызывает задержку, потому что я делаю это для каждого изображения в зависимости от того, является ли выбранный размер масштаба маленьким, средним или большим.

There is no "Cache-File" in your code.

Значит, я что-то недопонимаю. Разве lruCache не создает файл кэша в каталоге кэша моего приложения? Если нет, как работает?

First, you cannot force the user to install the app widget. Work on solving the actual performance problem, rather than trying to build some optimization that will not help all users.

Мое «приложение» — это всего лишь виджет приложения. Нет appIcon, как в FaceBook. Это только appWidget, когда он загружает мое приложение. Который запускает действие, когда вы нажимаете на кнопку.

Second, your process can readily be terminated milliseconds after onUpdate() completes. Do not fill a cache, only to have it never be used.

Я хочу использовать кеш, который я хочу заполнить Drawables в onUpdate appWidget, а затем я хочу использовать эти Drawables из кеша в своей деятельности. Так что я не понимаю, почему я никогда не буду использовать кэш? Может быть, я что-то неправильно понимаю.

Picasso would give you better performance from the user's standpoint.

Соответствует ли это моим потребностям после обновления прямо сейчас?

----------------------------------------------------------------------------- -------------------------------------------------------------

Обновление 2

Since the scaling should be done by the GPU and take microseconds, I have difficulty believing that is your problem. What specifically did Traceview show you that made you think that scaling has something to do with this?

Я заметил, что прокрутка очень плавная при среднем размере, потому что это почти исходный размер иконки приложения из PackageManager. При большой прокрутке, где отображаются только 2 или 3 значка приложений в строке (в среднем отображается 5 или 6, но это гораздо более плавно), он отстает. (с такой же логикой). Таким образом, единственным логическим ответом может быть масштабирование в XML в ImageView. Как я прокомментировал это XML-Scaling и масштабировал значки приложений до размера Large и поместил их напрямую в мой адаптер для GridView, он работает очень гладко (только одно или очень маленькие задержки в начале, потому что convertView равно нулю ??)

onUpdate() will be called much more frequently than the user will actually use your app widget.

Это сразу после каждого клика или в указанное время. Но я проверяю, был ли очищен кеш или нет, если нет, ничего не меняйте, если да, загрузите Drawables в кеш.


person MMike    schedule 20.12.2014    source источник


Ответы (1)


Я заметил, что их размер во время выполнения занимает слишком много времени при прокрутке сетки.

Используйте Traceview, чтобы точно определить, почему ваша реализация работает медленно.

Будет ли он существовать только до тех пор, пока существует процесс appWidget?

Он будет существовать только на время жизни процесса вашего приложения.

Или кэш-файл из lruCache остается в моем cacheDir моего приложения?

В вашем коде нет "кэш-файла".

Я не хочу каждый раз, когда пользователь нажимает на appWidget, создавать LruCache и заполнять его всеми относительно небольшими изображениями, которые позже понадобятся gridview. Я хочу сделать это один раз, или если пользователь очистит кеш, который будет проверяться каждый час (для экономии заряда батареи).

Во-первых, вы не можете заставить пользователя установить виджет приложения. Работайте над решением реальной проблемы с производительностью, а не пытайтесь создать какую-то оптимизацию, которая не поможет всем пользователям.

Во-вторых, ваш процесс может быть легко завершен через миллисекунды после завершения onUpdate(). Не заполняйте кеш, только чтобы он никогда не использовался.

Или есть намного лучший/более простой способ.

Используйте Traceview, чтобы определить точно, в чем заключается ваша проблема. Затем решить эту проблему. Например, проблема может заключаться в том, что вы загружаете эти изображения в основной поток приложения, и использование такой библиотеки, как Picasso, даст вам лучшую производительность с точки зрения пользователя.


Прокрутка приложения медленная, потому что я предоставляю три размера (маленький, средний, большой) и масштабирую их при прокрутке через мой вид сетки.

Поскольку масштабирование должно выполняться графическим процессором и занимать микросекунды, мне трудно поверить, что это ваша проблема. Что конкретно показал вам Traceview, что заставило вас думать, что масштабирование как-то связано с этим?

Разве lruCache не создает файл кэша в каталоге кэша моего приложения?

No.

Если нет, как работает?

Это кэш в памяти.

Так что я не понимаю, почему я никогда не буду использовать кэш?

onUpdate() будет вызываться намного чаще, чем пользователь будет фактически использовать виджет вашего приложения.

person CommonsWare    schedule 20.12.2014
comment
Спасибо за ваш ответ CommonsWare. Я обновил свой вопрос относительно вашего ответа. Пожалуйста, смотрите обновление. - person MMike; 20.12.2014
comment
Еще раз спасибо за ваше время CommonsWare, я снова обновил свой вопрос. Мы все ближе и ближе подходим к проблеме и ее решению. - person MMike; 20.12.2014