您的位置:首页 > 编程语言

安卓多线程编程系列4:使用message的几种不同方式(不同的构造方法和使用方式)

2016-03-04 16:10 387 查看
一个handler对应一个MessageQueue(消息队列),message是消息队列中数据的载体

Message(消息):是用来携带数据的

MessageQueue(消息队列):是用来存储消息的

handler:是用来发送和接收消息的

Looper:让消息队列一直进行循环的(管理整个这一摊事),汉语是“环”的意思 是一个死循环:Looper会一直将handler中的message存在消息队列,并不断从消息队列中取出,直到消息队列没有为止

消息队列中每一个消息都是由队尾插入,由队头取出

整体思路:在一个事件中开启一个线程,在一个线程中定义一个message,在这个message中携带数据,通过handler发送过去,在handler中的handleMessage中收到这个数据,并执行相应的操作。一个handler对应一个MessageQueue。Looper管理整个循环。具体而言,在xml'文件中放置一个Button控件,在activity的这个button的点击事件中使用多种不同的方法定义一个message,并赋值数据,使用handler来发送,在定义的handler对象中重写handleMessage方法,在这个方法中收到发送message的数据并展示。

activity_main.xml文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >

<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="164dp"
android:text="发送消息" />

</RelativeLayout>
MainActivity.java文件:

package com.example.android_handler_message2;
//使用message的几种方式(不同的构造方法和使用方式)
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

private  Button button;
private Handler handler=new Handler(){
@Override
public void handleMessage(android.os.Message msg) {
int arg1=msg.arg1;
int arg2=msg.arg2;
int what=msg.what;
Object obj=msg.obj;
Bundle bundle=msg.getData();
Toast.makeText(MainActivity.this, arg1+" "+arg2+" "+what+" "+obj, 1).show();
Toast.makeText(MainActivity.this, String.valueOf(bundle.getStringArray("str").length), 1).show();
//			  System.out.println(arg1+" "+arg2+" "+what+" "+obj);
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button=(Button)findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View arg0) {
//				启动一个子线程
new Thread(new MyThread()).start();
}
});
}

public class MyThread implements Runnable{

@Override
public void run() {
// TODO Auto-generated method stub
//			下面那句代码在源码中的解释:如果消息池中没有消息,就new一个message;如果有的话就从消息池中取出一个消息
/*
//			第一种方式
Message message=Message.obtain();
message.what=1;
message.arg1=2;
message.arg2=3;
message.obj="jack";
handler.sendMessage(message);
*/
/*
//			第二种方式
Message message=Message.obtain(handler);
message.what=1;
message.arg1=2;
message.arg2=3;
message.obj="jack";
message.sendToTarget();
*/
/*
//			第三种方式
Message message=Message.obtain(handler,33);
message.arg1=1;
message.arg2=2;
message.obj="rose";
message.sendToTarget();
*/
/*//		第四种方式
Message message=Message.obtain(handler,2,"tom");
message.sendToTarget();*/
//			第五种方式
Message message=Message.obtain(handler,2,3,2,"hello");
Bundle data=new Bundle();
data.putStringArray("str", new String[]{"jack","rose","tom"});
message.setData(data);
message.sendToTarget();
}

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: