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


曾田生z
427 声望34 粉丝

立法者三句修改的话,全部藏书就会变成废纸。——律匠