程序需要相应用户的操作,最要能在200ms(0.2s)之内,如果超过5秒没有反应,ActivityManager会没有提示就kill了 activity。然而,activity可能真的需要时间来进行处理,这往往会用到后台线程-background thread。后台线程可以安全 地和UI线程进行交互,其中后台线程是不能修改UI的。
通过创建一个Handler子类的对象,每个acvivity只需一个Handler对象。后台进程可通过两种方式Handler进行通信:message和Runnable对象,其结果实质都是将在Handler的队列中放入内容,message是放置信息,可以传递一些参数,Handler获取这些信息并将判度如何处理,而Runnable则是直接给出处理的方法。
这些队列中的内容(无论Message还是Runnable)可以要求马上执行,延迟一定时间执行或者指定某个时刻执行,如果将他们放置在队列头,则表示具有最高有限级别,立即执行。这些函数包括有:sendMessage(), sendMessageAtFrontOfQueue(), sendMessageAtTime(), sendMessageDelayed()以及用于在队列中加入Runnable的post(), postAtFrontOfQueue(), postAtTime(),postDelay()。
一般而言,推荐是Messge方式,这样程序设计得可以更为灵活,而Runnable在某些简单明确的方式中使用。我们将通过三种方法编写一个小例子来学习。这个例子是一个进度条,每隔1秒,进度条步进5,如果acvity停止时,进度条归零。
Android XML :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout ...... />
<ProgressBar android:id="@+id/c15_progress"
style="?android:attr/progressBarStyleHorizontal" <!-- 这表明采用传统水平进度条的方式-->
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</LinearLayout>
例子一:线程开启,采用Message传递后台线程和UI主线程之间的信息
public class Chapter15Test1 extends Activity{
private ProgressBar bar = null;
private boolean isRunning = false;
/* 我们为这个Acivity创建一个用于和后台程序通信的handler,简单地,只要一收到message,就将progressbar进度增加5。*/
/* 步骤1:创建Handler,并通过handleMessage()给出当收到消息是UI需要进行如何处理,例子简单不对msg的内容进行分析*/
Handler handler= new Handler(){
public void handleMessage (Message msg) {
bar.incrementProgressBy(5);
}
};
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.chapter_15_test1);
bar=(ProgressBar)findViewById(R.id.c15_progress);
}
/*on Start是UI初始化并显示时调用*/
protected void onStart() {
super.onStart();
bar.setProgress(0);
/*步骤2:建立后台线程处理,采用Thread,其中run()的内容,就是线程并行处理的内容,Thread是Runnable的implements*/
Thread background = new Thread(new Runnable(){
public void run () {
try{
for(int i = 0; i < 20 && isRunning; i ++){
Thread.sleep(1000);
/* 步骤2.1:发送Message到队列中,参数中的obtainMessage()是用于给出一个新Message,本例无参数,对应的在handler在队列中收到这条消息时,则通过handleMessage()进行处理*/
handler.sendMessage (handler.obtainMessage ());
}
}catch(Throwable t){
//jest end the thread
}
}
});
isRunning = true;
/*步骤3:启动线程*/
background.start();
}
/*onStop是UI停止显示时调用,例如我们按了返回键*/
protected void onStop() {
super.onStop();
isRunning = false;
}
}
例子2:采用Runnable
我们在上面的例子的基础上进行修改,如下
/*步骤1:由于不需要处理Message,也即不需要处理handleMessage()*/
Handler handler= new Handler();
/*步骤1.1:定义处理动作,采用Runnable的实例,通过implements run()来定制处理,这里是简单将进度条步进5。由于我们将在Thread中使用这个实例,所以考虑采用final的方式*/
final Runnable r = new Runnable() {
public void run(){
bar.incrementProgressBy(5);
}
};
/* ... ...在onStart()中的步骤2:线程的处理,和提供message不同,对于runnable方式,采用post */
Thread background = new Thread(new Runnable(){
public void run() {
try{
for(int i = 0; i < 20 && isRunning; i ++){
Thread.sleep(1000);
handler.post(r);
}
}catch(Throwable t){
//jest end the thread
}
}
});
background.start();
例子3:可以用延迟处理实现定时触发,让程序更为简单
在这里例子,事实我们是进行定时的处理,利用Handler队列可以设置延期处理的方式,我们并不需要创建一个后台运行的线程,也可以实现
Handler handler= new Handler();
... ... 在onStart() ... ...
//利用handler.postDelayed(r,1000),在队列中加入1秒后,进行r的处理,而在r的处理中,最后在handler的队列中加入一个延迟1秒的处理,如是,就可以每隔1秒进行一次处理。
handler.postDelayed(new Runnable() {
public void run() {
if(isRunning && Chapter15Test2.step < 20){
step ++;
bar.incrementProgressBy(5);
handler.postDelayed(this, 1000);
}
}
},1000 );
分享到:
相关推荐
总结来说,`Handler`、`Message`和`Runnable`是Android多线程编程中的核心工具,它们提供了安全、有序的线程间通信和UI更新机制,是开发高效、响应性良好的Android应用不可或缺的一部分。在实际项目中,开发者需要...
Handler是Android中用于线程间通信的工具,它可以发送和处理Message对象。Message对象通常包含处理结果或者命令,Handler会根据Message的what字段来区分不同的消息类型。 在上述示例中,我们创建了一个Handler实例...
3. **进程间通信设计**:涉及到的消息队列(Message Queue)通信,使用`msgget()`、`msgsnd()`、`msgrcv()`和`msgctl()`系统调用创建、发送、接收和管理消息。这是一种更复杂且灵活的进程间通信方式,可以传输更大...
4. Handler/Message:Android特有的主线程与子线程通信机制,通过发送和处理Message实现数据交换。 四、Android游戏开发中的多线程应用 1. 渲染线程:负责游戏画面的渲染,通常使用OpenGL ES进行图形处理,确保帧率...
`Handler`、`Looper`和`MessageQueue`共同构成了Android的消息处理机制,使得开发者能够轻松地在多线程环境中控制UI更新和其他任务的执行顺序。 总之,掌握线程的创建、线程池的使用以及`ThreadHandler`机制,对于...
Handler提供了 sendMessage和post方法,用于将消息或Runnable对象放入MessageQueue。当Looper从MessageQueue中取出Message时,会根据Message的目标Handler来决定哪个线程处理该消息。 4. **异步处理**:Message...
`Handler`、`Message`和`Looper`是Android系统提供的一个关键机制,用于在不同的线程间进行通信,特别是主线程(UI线程)与工作线程间的交互。下面将详细解释这三个组件以及它们如何协同工作。 1. **Handler...
Handler获取当前线程中的looper对象,looper用来从存放Message的MessageQueue中取出Message,再有Handler进行Message的分发和处理. 简单定义: 1、Message Queue(消息队列): 用来存放通过Handler发布的消息,通常...
Handler是Android中的一个关键组件,它用于在特定线程中发送和处理Message或Runnable对象。Handler有两个核心方法:`sendMessage()`和`handleMessage()`. `sendMessage()`可以在任何线程中调用,将消息放入消息队列...
- 实现Runnable接口:将任务封装在Runnable对象中,然后通过Thread类的构造函数传入并启动新线程。 - 继承Thread类:直接继承Thread类,并重写run()方法,创建并启动新线程。 - 使用ExecutorService:Java提供的并发...
总结一下,Android的Handler、Runnable和Looper机制是多线程编程的关键工具,它们提供了异步处理和UI更新的能力。理解并熟练运用这三个组件,对于编写高效、流畅的Android应用至关重要。在实际开发中,根据业务需求...
在主线程即UI线程外,新建一个Looper线程,并用Messenger和Handler来处理message和posted runnable。程序中,在负线程中默认加了一个3s的线程等来,来帮助理解sent message和post runnable之间的同步机制。所以在按...
在Android中,更常用的方式是使用`Handler`、`Looper`和`Message`来实现线程间的通信。`Looper`在线程中创建一个消息队列,`Handler`可以发送`Message`到这个队列,`Looper`会按照顺序处理这些消息。这种方式常用于...
Handler、Runnable和Thread都是实现多线程的方式,但它们之间有着不同的使用场景和特点。 1. 继承Thread类: 当一个类直接继承自Thread类时,可以直接覆写run()方法来实现多线程。这种方式的缺点是类的继承性受到...
2. Runnable:实现Runnable接口,然后通过Thread的构造函数传入Runnable实例,创建线程。 3. Handler/Looper/Message:这是一种消息驱动机制,通过Handler在子线程和主线程之间传递消息,实现数据同步。 4. ...
在Android开发中,线程的使用是至关重要的,因为Android系统的主要UI线程(也称为主线程或应用程序线程)负责处理用户...在实际开发中,根据任务特性和需求选择合适的线程管理策略,可以有效地提升应用的稳定性和效率。
为了防止UI线程被阻塞,Android引入了Handler、Looper和Message机制来实现线程间通信,尤其是主线程(UI线程)与工作线程之间的交互。"andriod多线程通信handler方法"这个主题正是关注这一核心概念。 首先,我们...
### Android的消息处理机制详解 #### 一、引言 Android应用程序是通过消息驱动的,它...通过合理使用Message、MessageQueue、Handler和Looper,开发者可以轻松地实现线程间的通信,从而提升应用的性能和用户体验。
在Android系统中,Message, MessageQueue, Looper, 和 Handler共同构成了一个跨线程通信机制,使得UI线程和其他工作线程之间能安全地交换数据和执行任务,这对于实现复杂的异步操作和保持用户界面的响应性至关重要。...
消息处理,尤其是Android中的Handler、Looper和Message机制,是实现线程间通信的关键。Handler是用来发送和处理消息的对象,通常在主线程中创建。Looper是运行在一个线程中的消息循环,负责从消息队列中取出消息并...