ҳ ʫ ֵ Ѵ ־ ѧУ վͼ
ǰλ: ҳ > ̳Ƶ > ƶ > Android >

Android进阶l习 - 高效昄BitͼQ在UIȝEA处理BitͼQ?

2013-04-02 
Android进阶l习 - 高效昄BitmapQ在UIȝEA处理BitmapQ?在UIȝEA处理Bitma

Android进阶l习 - 高效昄BitmapQ在UIȝEA处理BitmapQ?
在UIȝEA处理Bitmap     BitmapFactory.decode*  pd的方法,讨论的是怎么样去高效的加载大囄Q但是不图片数据的来源Q这些方法都不应该在UIȝE上使用。因些方法?费的旉是不可预估的Q图片加载?费的旉依赖于很多的因素Q网l或盘的读写?度,囄的大,手机CPU的夐理能力等{)。在E序中,只覠其中?囄加蝲dd了UIȝE,那么你的应用会无响应(ANRQ不能再与用戯行交互了Q,Androidpȝ会显C?知用P用户会选择关闭你的应用Q这是一w怸好的用户体验?/div>
     Z这原因Q你可以使用  AsyncTask 来在UIȝEA的线E中处理囄加蝲Q但还有?问题Q覠妥善处理好并发的问题Q下面将介绍这两U问题的处理Ҏ
使用AsyncTask       AsyncTask cMؓ我们提供了一U很好的方式来在UIȝE之外的U程中执行一些任务,q且把任务的l果返回到UIȝE上。你?l承AsyncTask cd重蝲?提供的方法来使用这异步d方式Q下面是?CZE序 

ListView?a href="http://www.android-doc.com/reference/android/widget/GridView.html" style="font-family:'courier new',courier,monospace; font-size:14px; font-weight:bold; line-height:21px; color:rgb(37,138,175); text-decoration:initial">GridView 这常的覹囄Ӟl合AsyncTask ?v使用的时候会产生另A?问题。ؓ了尽可能的提高内存的使用效率Q当用户滚动lgӞ这类视图lg会@环利用它的子视图Q@果每个子视图都姦发一?span style="background-color:rgb(249,249,249); color:rgb(34,34,34); font-family:Roboto,sans-serif; font-size:14px; line-height:19px"> AsyncTask Q那么将不会有保证相兌的覹图是否已l回收供另A?子覹囑@环用了。?且,异步d的执行顺序并不意味着d的执行结束时的顺序也是这L。结合这两原因Q引发的这个q发问题有可能会D囄讄雭视图上时会发生错位?
      针对这q发、错位问题,我们可以?a href="http://www.android-doc.com/reference/android/widget/ImageView.html" style="font-family:'courier new',courier,monospace; font-size:14px; font-weight:bold; line-height:21px; background-color:rgb(249,249,249); color:rgb(37,138,175); text-decoration:initial">ImageView 对象存储??使用?a href="http://www.android-doc.com/reference/android/os/AsyncTask.html" style="font-family:'courier new',courier,monospace; font-size:14px; font-weight:bold; line-height:21px; color:rgb(37,138,175); text-decoration:initial">AsyncTask 的引用,这样我们可以L任务是否完?/div>
     创徏?专用?a href="http://www.android-doc.com/reference/android/graphics/drawable/Drawable.html" style="font-family:'courier new',courier,monospace; font-size:14px; font-weight:bold; line-height:21px; color:rgb(37,138,175); text-decoration:initial">Drawable 子类来存储一个与之对应的AsyncTask (这个AsyncTask 实际上是用来加蝲Drawable 的任?Q当囄加蝲d还在执行Ӟ可以用这?a href="http://www.android-doc.com/reference/android/graphics/drawable/Drawable.html" style="font-family:'courier new',courier,monospace; font-size:14px; font-weight:bold; line-height:21px; color:rgb(37,138,175); text-decoration:initial">Drawable 来显CZ张默认的囄了,当任务完成时这个Drawable随之被替?/div>
class BitmapWorkerTask extends AsyncTask {    ...    @Override    protected void onPostExecute(Bitmap bitmap) {        // if task cancelled , this method is never invoked        // why check here ?         if (isCancelled()) {            bitmap = null;        }        if (imageViewReference != null && bitmap != null) {            final ImageView imageView = imageViewReference.get();            final BitmapWorkerTask bitmapWorkerTask =                    getBitmapWorkerTask(imageView);            // 判断当前task是否是相兌的task            if (this == bitmapWorkerTask && imageView != null) {                imageView.setImageBitmap(bitmap);            }        }    }}

     前面的ImageView加蝲的实现方式?用于?/span> ListView and GridView 这类的UI视图lgQ我们可以在Adapter中的getView()  Ҏ中调?/span>loadBitmap Ҏ 






ȵ