安卓多線程編程系列4:使用message的幾種不同方式(不同的構造方法和使用方式)

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

}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章