1 消息Message
在android的多线程中,把需要传递的消息称为消息
由于android的用户界面UI(user interface)是单线程的,所以如果UI花费太多的时间做后台的事情,超过5秒钟,Android就会给出错误提示。因此,为了避免”拖累“UI,一些费时的工作应该交给独立的后台线程去执行。,但是如果后台的线程直接执行UI对象,Android 会发出错误信息,所以UI线程和后台线程需要进行消息通信。UI线程将工作分配给后台线程。后台线程执行后将相应的消息返回给UI线程,让UI线程对UI完成相应地更新。
Message是一个描述消息队列的数据结构,Message包含许多成员变量和方法。消息Message的常用方法如下表:
方法 | 说明 |
Message() | 创建Message对象的构造方法 |
getTarget() | 获取将接受此消息的Handler对象,此对象必须实现Handler:handleMessage()方法 |
setTarget(Handler target ) | 设置接收此消息的Handler对象 |
sendToTarget() | 向Handler对象发送消息 |
int arg1 | 用于当仅需要存储几个整型数据消息时 |
int arg2 | 用于当仅需要存储几个整型数据消息时 |
int what | 用户自定义消息标识,避免各线程的消息冲突 |
2 消息处理工具Handler
Handler 是Android 中多个线程间消息传递和定时执行任务的”工具“类。Handler是消息的处理者,负责在多个线程之间发送Message和处理Message.
Handler 在多线程中有两个方面的应用:
1)发送消息。在两个不同的线程之间传递数据,使用的方法为sendXXX()
2)定时执行任务。在指定的未来某时间执行某任务,使用方法为sendXXX()
一个线程只能有一个Handler对象,通过该对象向所在线程发送消息。Handler除了给其他线程发送消息外,还可以给本线程发送消息。
方法 | 说明 |
Handler() | Handler对象的构造方法 |
handleMessage(Message msg) | Handler的子类必须使用该方法接收消息 |
sendEmptyMessage(int) | 发送一个空的消息 |
sendMessage(Message) | 发送消息,消息中可携带参数 |
sendMessageAtTime(Message,long) | 在未来某一时间点发送消息 |
sendMessageDelayed(Message.long) | 延时N毫秒发送消息 |
post(Runnable) | 提交计划任务马上执行提交计划任务马上执行 |
postAtTime(Runable,long) | 提交计划任务马上执行 |
postDelayed(Runable,long) | 提交计划任务延时N毫秒执行 |
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/text01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world"/>
<Button
android:id="@+id/button01"
android:layout_below="@id/text01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/button02"
android:layout_toRightOf="@id/button01"
android:layout_alignTop="@id/button01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/text02"
android:layout_below="@id/button01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</RelativeLayout>
Main_activity
package com.example.tread;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
TextView txt1,txt2;
Button btn1,btn2;
private boolean STOP=true;
private int count=0;
private mHandle handler;
private mThread thread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txt1=(TextView)findViewById(R.id.text01);
txt2=(TextView)findViewById(R.id.text02);
btn1=(Button)findViewById(R.id.button01);
btn2=(Button)findViewById(R.id.button02);
btn1.setOnClickListener(new click());
btn2.setOnClickListener(new click());
handler =new mHandle();
thread =new mThread();
}
class click implements OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(v==btn1){//处理“启动线程按钮”
//设置标志位
STOP=false;
//开启新线程
thread.start();
}else if(v==btn2){//处理“停止线程”按钮
STOP=true;
}
}
}
//定义Thread子类,实现没个1秒钟发送一次消息的功能
private class mThread extends Thread{
public void run(){
while(!STOP)//一直循环直到为真
{
try {
Thread.sleep(1000);//延时1秒
}catch(InterruptedException e){
e.printStackTrace();
}
Message msg=new Message();
msg.arg1=1;//消息标志
handler.sendMessage(msg);
}
}
}
//定义handler的子类接收和处理线程发送来的消息
private class mHandle extends Handler{
public void handlerMessage(Message msg){
switch(msg.arg1)
{
case 1:
{
count++;
txt2.setText(Integer.toString(count));
break;
}
}
}
}
}