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 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的线程模型,,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。