什么时候用到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;
}