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 block 19 e.printStackTrace(); 20 } 21 } 22 return null; 23 } 24 @Override 25 protected void onProgressUpdate(Integer... values) { 26 Toast.makeText(getApplicationContext(), values[0]+" ",0).show(); 27 } 28 @Override 29 protected void onPostExecute(Void result) { 30 Toast.makeText(getApplicationContext(), "执行完成",0).show(); 31 text.setText("执行完成"+new Date()); 32 } 33 }
Android技术11:Android的线程模型,布布扣,bubuko.com