android handler和AsyncTask用法
最近在研究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线程的功能。