Android异步加载

异步任务AsyncTask注意事项:

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

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

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

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

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

 

异步加载

如何提高用户体验:

使用缓存

Lru算法:

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

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

public class ImageLoader {

  private LruCache<String, Bitmap> mCaches;

  

 

  public ImageLoader(){

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

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

    mCaches = new LruCache<String,Bitmap>(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<NewsBean> data, Listview listview){

    mList = data;

    mInflater = LayoutInflater.from(context);

    mImageLoader = new ImageLoader();

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

    for (int i = 0; i<data.size(); 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<end; 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值