首页 > 代码库 > Android技术11:Android的线程模型

Android技术11:Android的线程模型

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     }