最近在研究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线程的功能。

更多相关文章

  1. Android(安卓)对话框(Dialog)大全 建立你自己的对话框
  2. Android中处理崩溃异常
  3. Android应用程序获取ROOT权限的方法
  4. Android调用JNI出错 java.lang.UnsatisfiedLinkError: No implem
  5. Android(安卓)编程下 Touch 事件的分发和消费机制理解
  6. Android(安卓)中文 API (90) —— WindowManager
  7. [Android(安卓)Pro] 使用CursorLoader异步加载数据 from 3.0
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. 13、华为 华三中小型企业网络架构搭建 【
  2. pycharm最新激活方法亲测有效可用!!!
  3. Windows系统中python的保姆级安装教程
  4. 12、华为 华三中小型企业网络架构搭建 【
  5. 一份优秀的数据分析报告该具备什么条件?
  6. php学习笔记(类的别名引入与命名冲突的解
  7. Scrapy有什么功能?架构有哪些?
  8. 给一些不懂又装逼的一些人的建议
  9. 51CTO博客意见反馈处【2021版】
  10. Oracle OCP 19c 认证1Z0-083考试题库(第8