android handler和AsyncTask用法

openkk 12年前

最近在研究android的handler和AsyncTask的使用方法,经过几天的学习和在网上查阅资料后总算做出了一个完整的程序,大家可以参考参考。

程序源码如下:

private Handler handler = new Handler() {      @Override    public void handleMessage(Message msg) {     switch (msg.what) {     case 1:      adapter.notifyDataSetChanged();      break;     }    }   };  public void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    showContent();   }   private void showContent() {    listView = (ListView) findViewById(R.id.journals_list_one);    // MyTask myTask = new MyTask();    // myTask.execute(null);     new Thread() {         @Override     public void run() {     try {     Thread.sleep(5000);     loadData();     } catch (InterruptedException e) {     e.printStackTrace();     }     }         }.start();    adapter = new JournalListAdapter(this, data);      listView.setAdapter(adapter);                    }     /**    * 构造List列表数据    */   private void loadData() {    if (data.size() <= 40) {     for (int i = 0; i < 10; i++) {      Map<String, String> map = new HashMap<String, String>();      map.put("title", getString(R.string.title));      map.put("desc", getString(R.string.content));      data.add(map);      Message message = handler.obtainMessage();      message.what = 1;      message.sendToTarget();     }     }   }     class MyTask extends AsyncTask<String, String, String> {      private ProgressDialog progressBar;      @Override    protected void onPreExecute() {     progressBar = new ProgressDialog(MainPageActivity.this);     progressBar.setMessage("正在加载数据请稍后...");     progressBar.setIndeterminate(true);     progressBar.show();     super.onPreExecute();    }      @Override    protected String doInBackground(String... params) {     try {      Thread.sleep(5000);      loadData();     } catch (InterruptedException e) {      e.printStackTrace();     }     return null;    }      @Override    protected void onProgressUpdate(String... values) {     super.onProgressUpdate(values);     adapter.notifyDataSetChanged();    }      @Override    protected void onPostExecute(String result) {     super.onPostExecute(result);     progressBar.dismiss();    }     }

上面我把2中方式都写了,其中AsyncTask这个类感觉使用比较简单,就是实现其中几个方法,onPreExecute()方法是在任务刚开始运行时执行的一些初始化操作,比如初始化一个进度条等等,然后就执行doInBackground()方法这里面主要放业务操作,比如查询数据库等,在这个方法执行的时候会调用onProgressUpdate(),可以在这个方法中更新UI界面,最后是调用onPostExecute()方法,当得到业务结果后就可以在这个方法中返回给UI线程,也可以关闭一些执行这个业务时开的一些资源。大家可以看得出AsyncTask这个类是一个泛型类,这个类的三个参数以此对应doInBackground(String... params),onProgressUpdate(String... values),onPostExecute(String result)的参数,很形象的···如果不需要传参和返回值,可以用Void代替。而doInBackground(String... params)方法的返回值也就是onPostExecute(String result)方法的参数值,因为doInBackground方法执行后返回的值是在onPostExecute(String result)中处理的。

用handler方式处理需要知道与handler相关的几个组件,Looper和Queue,其实Looper的作用就是把handler发送的消息放到Queue中,并把消息广播给所有与这个Queue相关的handler,而Queue一般是主线程开启的时候就给这个线程分配了一个,所以你要与UI主线程通信必须用于这个Queue相关联的handler对象才行,一般handler对象在那个线程中创建的就与那个线程的queue关联,所以在UI线程中创建的handler对象就与UI线程通讯,这样我们就可以在子线程中发送消息给主线程,实现更新UI的功能。那主线程又是怎么处理子线程发送的消息的呢?其实在生成handler对象的时候我们就要实现handler对象的handleMessage()方法这个方法就是主线程接受并处理子线程发送过来的消息的方法,从而实现 更新UI线程的功能。