1.Android的单线程模型

在android应用程序启动时,Android会同时启动一个对应的主线程Main Thread。主线程主要负责处理UI方面的事件,所以又称UI线程。Android应用程序必须遵守单线程模型原则:androidUI操作不是线程安全的,并且这些操作必须在UI线程中完成。UI线程负责事件监听和绘图处理,因此必须保证UI线程能够随便响应用户,所以那些非常耗时的,必须放到其他线程中处理,如网络连接,数据库读取等操作,否超过一定时间没有响应,则应用程序就会终止。

2、消息队列机制实现

Message Queue是一个消息队列,用来存放通过Handler发布的消息。Android第一次启动时UI线程会默认创建一个关联的消息队列。通过Looper.myLoop()或Looper.getMainLooper()获得。

Handler可以发布或者处理消息或者是一个Runnable的实例。

3.两种实现

3.1Handler实现

获取UI线程创建的looper,looper=Looper.getMainLooper();

在UI线程中创建Handler,并覆盖其处理方法

handler=new Handler(looper){
@Override
public void handleMessage(Message msg) {
text.setText((String)msg.obj+" "+new Date());
}
};

发送消息

Message message=Message.obtain();
message.obj="Forsat";
handler.sendMessage(message);

3.2AsyncTask实现

onPreExecute():该方法将在执行实际的后台操作前被UI线程调用,可以在该方法中做一些准备工作,如界面显示进度条。

doInBackground(Params...):在方法onPreExecute()执行后马上执行,该方法在后台执行,主要负责很耗时的后台计算。

publishProgress():更新实时的任务进度,该方法时抽象方法,必须实现子类

onProgressUpdate(Progress...):在publishPreogress方法被调用后,UI线程调用。

onPostExecute():在doInBackground()之后执行,可以被UI线程调用。

实现的类,只需要调用execute()就执行,可以处理相对复杂的线程通信。

 1 class UpdateTime extends AsyncTask<Void, Integer, Void>{ 2  3         @Override 4         protected void onPreExecute() { 5              6             Toast.makeText(getApplicationContext(), "开始",0).show(); 7         } 8         @Override 9         protected Void doInBackground(Void... params) {10             11             for(int i=5;i>=0;i--)12             {13                 14             publishProgress(i);15              try {16                 Thread.sleep(1000);17             } catch (InterruptedException e) {18                 // TODO Auto-generated catch block19                 e.printStackTrace();20             }21             }22             return null;23         }24         @Override25         protected void onProgressUpdate(Integer... values) {26             Toast.makeText(getApplicationContext(), values[0]+" ",0).show();27         }28         @Override29         protected void onPostExecute(Void result) {30             Toast.makeText(getApplicationContext(), "执行完成",0).show();31             text.setText("执行完成"+new Date());32         }33     }

更多相关文章

  1. Android离线安装方法
  2. Android 消息提示框:五种Toast详解
  3. 丢失Android系统库或者Conversion to Dalvik format failed with
  4. Android 消息机制之Message
  5. Android的消息处理机制(深入源码)
  6. Android 多线程AsyncTask详解
  7. Android消息处理系统原理简要概述
  8. Android 多线程之 AsyncTask

随机推荐

  1. 如何修改应用兼容Android 3.0系统
  2. Android安装和删除(卸载)应用软件程序(ap
  3. Android(安卓)Q 接入 MQTT
  4. android 扫描SD卡与系统文件(转)
  5. android搭建环境错误 daemon not running
  6. Eclipse 卡死在 Android SDK Content Loa
  7. Android有效解决加载大图片内存溢出问题
  8. 屏蔽警告: WARNING: EmulatorService.cpp:
  9. Android 中文 API 文档 (44) ―― Chronome
  10. android 控件xml属性