码迷,mamicode.com
首页 > 移动开发 > 详细

Android技术11:Android的线程模型

时间:2014-08-04 01:42:56      阅读:356      评论:0      收藏:0      [点我收藏+]

标签:android   style   blog   color   os   io   数据   for   

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

Android技术11:Android的线程模型

标签:android   style   blog   color   os   io   数据   for   

原文地址:http://www.cnblogs.com/forsta/p/3889132.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!