Android Bitmap Processing Bitmaps Off the UI Thread(渣翻译)

二:UI线程外加载图像

1.使用AsyncTask
AsyncTask类提供了一个简单的后台处理方法并将结果返回到UI线程中。
在线程中提议使用WeakReference<?>来缓存显示Bitmap的UI控件,如:ImageView。WeakReference能够确保即使在线程操作时,也能让资源回收器回收UI控件资源,如:ListView回收View资源的情况。
ex:

ImageView imageview = new ImageView(new LayoutParams(100, 100));
//初始化WeakReference
WeakReference<ImageView> reference = new WeakReference<ImageView>(imageview);
//获取WeakReference存储内容
if(reference != null && reference.get() != null)
    ImageView imageView = reference.get();

2.处理并发操作(多线程加载)
一些通用的组件(例如ListView和GridView)提倡另一种主流做法,当组件结合AsyncTask来显示内容时,为了有效的利用内存,用户滚动组件后,组件会回收子View资源(超出显示区域的子View)。
如果每一个子View都触发一个AsyncTask,将无法保证当该子View的AsyncTas完成时,该子View尚未被资源回收器回收就被其他子View重用。而且也无法保证异步线程开始的顺序和完成的顺序一致。
接下来这么做:
创建一个BitmapDrawable的继承类(假设为AsyncDrawable)来存储对AsyncTask引用,同样可以用到WeakReference。再执行AsyncTask前,可以先创建AsyncDrawable并绑定到ImageView上。
在进行上一步操作前,需要进行一次校验(如果当前的ImageView为重用的资源且加载的图像资源也一致,就不需要开启线程去加载同样的图像资源了),通过图像资源的标志(如ID,URI)和ImageView(如Drawable),在校验中确定是否取消AsyncTask(调用cancel()方法)。
最后在AsyncTask中需要追加看一个判断,当线程isCancelled()时,结束onPostExecute操作并返还结果,这样便强制结束重用ImageView中的线程。

时间: 2024-11-07 18:29:03

Android Bitmap Processing Bitmaps Off the UI Thread(渣翻译)的相关文章

Android Bitmap Caching Bitmaps(渣翻译)

三.缓存图像 1.使用内存缓存内存缓存在提高占用APP内存的情况下,提供快速访问图像的便利.提倡使用LruCache来引用图像(早在API4的Support Library中已经提供该类),通过强引用LinkedHashMap来缓存LruCache,保持最新最近使用的LruCache,移除最后使用的LruCache,从而避免内存溢出.在过去的缓存引用方式中,比较流行使用SoftReference或者WeakReference来引用图像,然而,在API 9(Android 2.3)开始,资源回收器

Android Non-UI to UI Thread Communications(Part 3 of 5)

Original:http://www.intertech.com/Blog/android-non-ui-to-ui-thread-communications-part-3-of-5/ Continuing my series on Android non-UI thread-to-UI thread communications, this post covers use of the Handler Framework to facilitate the communications. 

Android Non-UI to UI Thread Communications(Part 1 of 5)

original:http://www.intertech.com/Blog/android-non-ui-to-ui-thread-communications-part-1-of-5/ ANDROID UI THREAD AND ANR On the Android platform, applications operate, by default, on one thread.  This thread is called the UI thread.  It is often call

Android 判断当前thread 是否是UI thread

在Android 中判断当前的Thread是否是UI Thread 的方法: 1. if (Looper.myLooper() == Looper.getMainLooper()) { // Current thread is the UI/Main thread } 2. if (Looper.getMainLooper().getThread() == Thread.currentThread()) { // Current thread is the UI/Main thread } 参考

Android Non-UI to UI Thread Communications(Part 2 of 5)

Original:http://www.intertech.com/Blog/android-non-ui-to-ui-thread-communications-part-2-of-5/ his is the second part of my series of blog posts on Android non-UI thread-to-UI thread communications. See herefor the start of the series.  As a refreshe

Android Training Caching Bitmaps 翻译

原文:http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html 图片缓存 在Android开发中,加载一个图片到界面很容易,但如果一次加载大量图片就复杂多了.在很多情况下(比如:ListView,GridView或ViewPager),能够滚动的组件需要加载的图片几乎是无限多的. 有些组件的child view在不显示时会回收,并循环使用,如果没有任何对bitmap的持久引用的话,垃圾回收器会释放你加载的

android内存优化5—对界面UI的优化(2)

在一个应用程序中,一般都会存在多个Activity,每个Activity对应着一个UI布局文件.一般来说,为了保持不同窗口之间的风格统一,在这些UI布局文件中,几乎肯定会用到很多相同的布局.如果我们在每个xml文件中都把相同的布局都重写一遍,一个是代码冗余,可读性很差:另一个是修改起来比较麻烦,对后期的修改和维护非常不利.所以,一般情况下,我们需要把相同布局的代码单独写成一个模块,然后在用到的时候,可以通过<include /> 标签来重用layout的代码. 常见的,有的应用在最上方会有一个

Android中的Handler, Looper, MessageQueue和Thread

Android中的Handler, Looper, MessageQueue和Thread 前几天,和同事探讨了一下Android中的消息机制,探究了消息的发送和接收过程以及与线程之间的关系.虽然我们经常使用这些基础的东西,但对于其内部原理的了解,能使我们更加容易.合理地架构系统,并避免一些低级错误. 对于这部分的内容,将分成4小节来描述: 1.职责与关系 2.消息循环 3.线程与更新 4.几点小结 ------------------------------------------------

android内存优化4—对界面UI的优化(1)

在Android应用开发过程中,屏幕上控件的布局代码和程序的逻辑代码通常是分开的.界面的布局代码是放在一个独立的xml文件中的,这个文件里面是树型组织的,控制着页面的布局.通常,在这个页面中会用到很多控件,控件会用到很多的资源.Android系统本身有很多的资源,包括各种各样的字符串.图片.动画.样式和布局等等,这些都可以在应用程序中直接使用.这样做的好处很多,既可以减少内存的使用,又可以减少部分工作量,也可以缩减程序安装包的大小. 下面从几个方面来介绍如何利用系统资源. 1)利用系统定义的id