AsyncTask 和 Thread+Handler 的比较 - 曾田生z
首先 : 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学习的一些摘要,资料来着网上加自己的一些注解,如有需要在下表明出处的地方请联系我,我马上补上!!