首先 : AsyncTask 和 Thread+Handler 的比较:
1.AsyncTask实现的原理和适用的优缺点
AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程.
使用的优点:
简单,快捷
过程可控
使用的缺点:
在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来.
2.Handler异步实现的原理和适用的优缺点
在Handler 异步实现时,涉及到 Handler, Looper, Message,Thread四个对象,实现异步的流程是主线程启动Thread(子线程)运行并生成Message-Looper获取Message并 传递给HandlerHandler逐个获取Looper中的Message,并进行UI变更。
使用的优点:
结构清晰,功能定义明确
对于多个后台任务时,简单,清晰
使用的缺点:
在单个后台异步处理时,显得代码过多,结构过于复杂(相对性)
综上所述:
数据简单使用AsyncTask:实现代码简单,数据量多且复杂使用handler+thread :相比较
AsyncTask来说能更好的利用系统资源且高效 .AsyncTask其实是Android给开发者提供的
一个简单轻量级的多线程类,通过它我们可以很容易新建一个线程做一些耗时的操作,并在
这个过程中更 新UI。之所以说它轻量级,是因为缺少了直接使用Thread的灵活性。如果是
很复杂的操作,还是建议通过Thread来操作,然后通过 Broadcast的方式来更新UI。
3.例子:
Thread+Handler 异步加载并更新UI
首先实现 run() 方法 :
public void showimageThread(ImageView imageView,final String url){
mimageView=imageView;
murl=url;
new Thread(){
public void run() {
super.run();
Bitmap bitmap=getBitmapFromUrl(url);
//此时的bitmap不能直接赋给ImageView,要创建Message将bitmap用handler发送出去给Handler,使之在主线程ui中更新
Message message=Message.obtain();
message.obj=bitmap; // 传递给 handler 的 message 是 object 可以是任何参数,这里是一张位图
handler.sendMessage(message);
}
}.start();
}
其次 handler.sendMessage(message); 给handler 发了条消息, handler 接收消息来更新UI
private Handler handler=new Handler(){
@SuppressLint("HandlerLeak")
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (mimageView.getTag().equals(murl)) {
mimageView.setImageBitmap((Bitmap)msg.obj);
}
}
};
AsyncTask 异步加载并更新UI
/**
* AsyncTask<String, Integer, Object>
* String : 传给 AsyncTask 的参数 只传一个时 可以 param[0] 得到参数
* Integer : 当不记录中间过程 传 void
* Object : return 出的 参数 比如下面 就 return getJsonData(param[0]) -->
* List<Bean> -->给onPostExecute(List<Bean> bean)
*/
class NewsAsynTask extends AsyncTask<String, Void, List<Bean>>{//Void 表示不记录中间过程
// doInBackground 相当于 new Thread(){}.start ;
protected List<Bean> doInBackground(String... param) {
return getJsonData(param[0]); // 这里 return的 是 List<Bean>
}
//第三步 onPostExecute将生成的数据传递给NewsAdapter 即将生成的bean设置给listview
// onPostExecute 相当于 Handler handler=new Handler(){} 用来更新 UI的
protected void onPostExecute(List<Bean> bean) {
super.onPostExecute(bean);
NewsAdapter adapter=new NewsAdapter(MainActivity.this,bean,listView);
listView.setAdapter(adapter);
}
}
// doInBackground 相当于 new Thread(){}.start ;
// onPostExecute 相当于 Handler handler=new Handler(){} 用来更新 UI的
怎么调用 :
new NewsAsynTask().execute(URL);//第一步NewsAsynTask将一个url传递进来,实现对url的异步访问
// String URL 就是 param[0] ;
// 这样就 启动异步线程 了
声明:本文对Android学习的一些摘要,资料来着网上加自己的一些注解,如有需要在下表明出处的地方请联系我,我马上补上!!