Android异步加载

异步任务AsyncTask注意事项:

必须在UI线程中创建AsyncTask的实例。

必须载UI线程中调用AsyncTask的execute()方法。

重写的四个方法是系统自动调用的,不应手动调用。doInBackground()、onProgressUpdate()、

每个AsyncTask只能被执行一次,多次调用将会引发异常。

  doInBackground()方法是运行在其他线程,不能在这里更新UI。其他的方法都是运行在主线程。

 

异步加载

如何提高用户体验:

使用缓存

Lru算法:

Lru:Least Recently Used 近期最少使用算法

Android提供了LruCache类来实现这个缓存算法

public class ImageLoader {

  private LruCache mCaches;

  

 

  public ImageLoader(){

    int maxMemory = Runtime.getRuntime().maxMemory();    //获取最大可用内存

    int cacheSize = maxMemory / 4;    //最大内存的四分之一大小作为缓存

    mCaches = new LruCache(cacheSize);

      @Override

      protected int sizeOf(String key, Bitmap value){

        //在每次存入缓存的时候调用

        return value.getByteCount();  //将Bitmap实际大小保存进去

      }

  }

 

  //增加到缓存,增加之前先判断当前缓存是否存在

  public void addBitmapToCache(String url, Bitmap bitmap){

    if (getBitmapFromCache(url)==nulll){

      mCache.put(url, bitmap);

    }

  }

 

  //从缓存中获取数据

  public Bitmap getBitmapFromCache(String url){

    return mCache.get(url);

  }

}

 

如何提高效率:

ListView滑动停止后才加载可见项

ListView滑动时,取消所有加载项 

 

  private int mStart,mEnd;

  public static String[] URLS;

  private boolean mFirstIn;

 

  public NewsAdapter(Context context, List data, Listview listview){

    mList = data;

    mInflater = LayoutInflater.from(context);

    mImageLoader = new ImageLoader();

    URLS = new String[data.size()];

    for (int i = 0; i

      URLS[i] = data.get(i).newsIconUrl;

    mFirstIn = true;  

    }

  }

 

  //将mTask中所有任务取消

  public void cancelAllTask(){

    in (mTask != null){

      for (NewAsyncTask task : mTask) {

        task.cancel(false);

      }

    }

  }

 

  public void loadImages(int start, int end){

    for (int i = start; i

      String url = newsAdatper.URLS[i]; 

    }

  }

  public void onScrollStateChanged(AbsListView view, int scrollState){

    if (scrollState == SCROLL_STATE_IDEL){

      //滚动完后,加载可见项

      mImageLoader.loadImages(mStart, mEnd);

    } else {

      //其他时间停止加载任务

      mImageLoader.cancelAllTask

    }

    

    }

  }

 

  public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItem){

    mStart = firstVisibleItem;

    mEnd = firstVisibleItem + visibleItemCount;  //第一个可见元素加上可见元素的数量

    //第一次显示的时候调用

    if (mFirstIn && visibleIntemCount >0){

      mImageLoader.loadImages(mStart, mEnd);

      mFristIn = false;

    }

  }

 

总结:

通过异步加载,避免阻塞UI线程

通过LruCache,将已下载图片放到内存中

通过判断ListView滑动状态,决定何时加载图片

不仅仅是ListView,任何控件都可以使用异步加载

 

转载于:https://www.cnblogs.com/weiguang/p/6627706.html

你可能感兴趣的:(Android异步加载)