在Appwidget中准备LruCache

时间:2014-12-20 14:29:15

标签: android gridview android-appwidget android-lru-cache

我有appwidget,当用户点击它时会启动activity

在我的活动中,我有gridview包含相对较小的Drawables(图片,因为drawable可能不仅仅是图像),但用户可以size

我注意到需要too Long to size them at runtime when Scrolling trough the gridview.

我想在我的lruCache中准备一个one time appWidget's onUpdate,当用户将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时
(if it happens once at the very beginning)

只有appWidget存在进程才会存在吗?或者来自lruCache的Cache-File是否保留在我的应用程序的cacheDir中?或者在appWidget完成后它会被删除吗?如果它确实存在于我的appWidget的进程生命周期内,我如何从我的Activity中访问它?

我不希望每次用户点击appWidget时都会创建一个LruCache,并用Gridview稍后需要的所有相对较小的图像填充它。我想做一次,或者如果用户清除将每小时检查一次的缓存(以节省电池)。

问题

我怎样才能实现这一目标?或者有更好/更简单的方式。

时间不是CommonsWare问题,我将appWidget放在屏幕上时通知用户正在准备缓存。

感谢任何帮助。

有关Use Traceview to determine specifically why your implementation is slow.回复

的更新

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

应用程序滚动很慢,因为我提供了三种尺寸(小型,中型,大型),并且我在通过我的gridview滚动时缩放它们。(因为在活动启动时需要几秒钟来缩放它们,所以我不喜欢我想要那个)。

在这里看到我在我的imageview中做了什么,稍后会显示drawable(这是一个appIcon):

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

这导致滞后,因为我根据选择的比例尺寸是中等还是大来为每个图像执行此操作。

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.

那么我就是在误解某些东西。 lruCache不是在我的应用程序的Cache-Directory中创建一个Cache-File吗?如果不是如何起作用?

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

我的“app”只是一个appwidget。在FaceBook上没有appIcon。当他卸载我的应用程序时,它只是一个appWidget。单击按钮时会启动活动。

onUpdate

我想使用我想在appWidget的Picasso would give you better performance from the user's standpoint.中填充Drawables的Cache,然后我想在我的活动中使用Cache中的这些Drawables。所以我不明白为什么我永远不会使用缓存?也许我误会了什么。

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?

现在更新后是否符合我的需求?

-------------------------------------------- ------------------------------------------------- < /强>

更新2

PackageManager

我注意到Scrolling在中等大小时非常流畅,因为它几乎是来自convertView的appIcon的原始大小。如果滚动槽很大,每行只显示2或3个appIcons(在介质上显示5或6,但它更加流畅)m滞后。 (背后有相同的逻辑)。所以唯一的Logical answere可以在ImageView中扩展XML。正如我评论XML-Scaling并将appIcons缩放到Large大小并将它们直接放到我的适用于GridView的适配器上它运行得非常顺利(因为onUpdate() will be called much more frequently than the user will actually use your app widget.为null,所以在开始时只有一个或非常小的滞后??)

{{1}}

在每次onclick或指定时间之后都是正确的。但我检查是否已清除缓存,如果不是,则更改任何内容,如果是,则将Drawables加载到缓存。

1 个答案:

答案 0 :(得分:-1)

  

我注意到在通过gridview滚动时,在运行时调整它们的时间太长了。

使用Traceview明确确定实施速度缓慢的原因。

  

只有appWidget存在过程才会存在吗?

它仅在您的应用程序的生命周期内存在。

  

或者来自lruCache的Cache-File是否保留在我的app的cacheDir中?

您的代码中没有“缓存文件”。

  

我不希望每次用户点击appWidget时都会创建一个LruCache,并用Gridview稍后需要的所有相对较小的图像填充它。我想做一次,或者如果用户清除将每小时检查一次的缓存(以节省电池)。

首先,您无法强制用户安装应用小部件。努力解决实际的性能问题,而不是尝试构建一些无法帮助所有用户的优化。

其次,在onUpdate()完成后的几毫秒内,您的进程可以很容易地终止。不要填充缓存,只是永远不要使用它。

  

或者有更好/更简单的方式。

使用Traceview确定问题所在的完全。然后,解决这个问题。例如,问题可能是您正在主应用程序线程上加载这些图像,并且使用像Picasso这样的库可以从用户的角度为您提供更好的性能。


  

应用程序滚动很慢,因为我提供了三种尺寸(小,中,大),并且我在滚动浏览我的gridview时缩放它们

由于缩放应该由GPU完成并且需要几微秒,因此我很难相信这是你的问题。 Traceview特别向您展示了哪些让您认为缩放与此有关?

  

lruCache不是在我的应用程序的Cache-Directory中创建一个Cache-File吗?

没有

  

如果不是如何起作用?

这是一个内存缓存。

  

所以我不明白为什么我永远不会使用缓存?

onUpdate()将比用户实际使用您的应用小部件更频繁地被称为