异步加载(AsyncTask)

  什么时候用到AsyncTask? (ANR)

目前知道的情况 当访问网络时和加载图片时

原因:androi单线程模型和耗时操作放在非UI线程中

AsyncTask怎么用

一、

1.建立以个继承AsyncTask<Params,Progress,Result>的类需要传入泛型3个

Params:启动任务时,输入参数的类型

Progress:后台任务执行中返回进度值得类型

Result:执行完成之后返回结果的类型

此前我已经将Params赋值String,progress赋值Void,Result赋值List<NewsBean>

OnPreExecute():初始化操作

后面我们来看doInBackground(String... params):耗时操作,异步执行后台线程要完成的任务

如果只传入一个参数  String url = params[0]

返回的是List<NewsBean>类型

OnPostExecute(List<NewsBean>):doInBackground之后自动调用,并将doInbackgroud的返回值做参数

你可以在这里面为什么listview.setAdapter();

OnProgressUpdate():在doInBackground调用publishProgress()更新进度将会触法该方法

 

二、

加载图片

在listview适配器中,我们重写适配器

其中有ImageLoader这个类对象(自己写的)

1.listView.setOnScrollListener(this);   //设置滚动监听事件

通过滚动监听事件:

    I、加载可见项

    II、在没有滚动的时候才加载,否则不加载(提高用户体验)

2.为了实现异步加载我还在里面写了个继承AscnyTask的类

ImageLoader中有两个很关键的成员变量

  LruCache<String, Bitmap> mCache; //String url 作为名称去保存,  Bitmap为保存的对象

  Set<NewAsyncTask> mTasks;

第一个是缓存对象下次取出来时,可以根据String url(每个图片都有自己对应的url,从Json数据中取出)

第二个是保存自己创建的异步加载任务的集合,每当e'xecute(url)玩,则将Task添加进集合

          @Override

protected Bitmap doInBackground(String... params) {

String url = params[0];

//从网络获取图片(一定不在缓存中)   因为此前调用execute(url)之前要判断是否从缓存中                           //取得出Bitmap,如果取不出,则表明这是前面没有加载过的项

Bitmap bitmap = getBitmapByURL(url);

//将图片加入缓存中

if(bitmap!=null){

addBitmapToCache(url, bitmap);

}

return bitmap;

}

猜你喜欢

转载自270827204.iteye.com/blog/2254032
今日推荐