1)您必须成为您自己的浏览器。
将您的拇指下载到SDCard中,而不是将它们放在RAM中。在保存它们之前缩小/旋转它们,以便在下次需要加载它们时,SD卡上的“加载”是免费的,而不是来自Internet的昂贵。 (即:像任何浏览器一样,使用本地文件缓存)。
发布您可能创建的任何临时Bitmap对象来执行此操作。
了解如何使用“inSampleSize”参数以低于原始分辨率的方式打开位图。
如果您写入的文件以图像扩展名(.jpg等)结尾,它们将显示在图库中,因此不要将拇指保存为明显的图像文件名。
2)创建一个分层缓存系统(位图> SDCard>互联网)。
当您解包缩略图时,请将其保存在SoftReference缓存中。如果您需要使用该缩略图,请从缓存中获取。如果VM需要更多内存,则您的SoftReference实例可能会返回null。
如果您从位图缓存中获取空值,请检查您是否已将网址放在SD卡上并从此处将其加载到位图缓存中。
如果您从文件系统中获得空白,请从互联网上下载图像并将其保存到SDCard并将其粘贴到位图缓存中。
3)释放未使用的资源。
以同样的方式,确保您在视图离屏后立即从视图中清除位图(如果您的视图存在于ListView或其他基于Adapter的元素中,则本质上是“自由的“ - 回收视图元素) - 但是,如果您将ImageViews与Bitmaps实例化,并且它们不会立即显示在屏幕上,那么您可能正在浪费堆。
您可以简单地在ImageView上调用setImageBitmap(null);,并且对位图的引用将被丢弃(这样如果唯一的引用是SoftReference,当它不被使用时)。
4)从非UI线程注意什么线程你英寸
记住,你必须下载位图(我们使用一个服务实例作为意图的请求队列),和你必须附加位图仅在UI线程中查看实例。
您需要创建一个好的排队系统,将所有内容都加载到UI线程中的位图缓存中,然后使用Handler通知位图缓存在UI线程中填充ImageView。
5)注意你的下载队列。
如果你像我们一样,你有两个拇指和全尺寸的图像,则需要手动使用优先级队列,你的拇指请求之前把你的形象的要求,或使用两种不同的服务(即排队他们单独的意图)下载拇指VS完整图像。
否则,您可能会排列一个充满拇指下载的屏幕,但直到所有拇指完成后才会以完整图像回应。
6)询问系统有多少RAM。
Debug.MemoryInfo memoryInfo = new Debug.MemoryInfo();
Debug.getMemoryInfo(memoryInfo);
7)“onLowMemory()”不符合您的期望。
当用户在手机上运行太多应用程序时,操作系统需要从所有正在运行的应用程序中恢复物理内存。
这与应用程序虚拟机堆完全分离,就像加载太多位图很容易做到的。据我所知,你不会得到警告,你只会崩溃(你可以通过上面的调用跟踪记忆信息)。
希望能帮助我们设法让下载和显示来自互联网的大拇指变得聪明起来。
mig