Android线程的数据通信

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毫秒执行
layout

<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;
    		}
    		}
    	}
    }
    	 


}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值