当前位置

网站首页> 程序设计 > 开源项目 > 程序开发 > 浏览文章

AsyncTask 和 Thread+Handler 的比较 - 曾田生z

作者:小梦 来源: 网络 时间: 2024-03-25 阅读:

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

热点阅读

网友最爱