当前位置: 代码迷 >> Android >> Android之Handler详解(4)
  详细解决方案

Android之Handler详解(4)

热度:14   发布时间:2016-05-01 19:19:42.0
Android之Handler详解(四)

d、自己创建新的线程,然后在新线程中创建Looper,主线程调用子线程中的发消息方法,将消息发给子线程的消息队列。

package com.dxyh.test;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Looper;import android.os.Message;import android.util.Log;public class MainActivity extends Activity {	private final static String TAG = "HandlerTest";		private final static int TASK_BEGIN	= 1;	private final static int TASK_1	= 2;	private final static int TASK_2	= 3;	private final static int TASK_END	= 4;		private Handler workHandler = null;	    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        Log.i(TAG, "[M_TID:" + Thread.currentThread().getId() + "]" +        		"This is in main thread.");                LooperThread testThread = new LooperThread();        testThread.start();                // 注意,这里需要等待一下,防止出现空指针异常        while (null == workHandler) {        }                testThread.sendMessageTodoYourWork();    }        class LooperThread extends Thread {    	@Override    	public void run() {    		Looper.prepare();    		    		workHandler = new Handler() {    			// 现在在每个case之后,你可以做任何耗时的操作了    	    	@Override    	    	public void handleMessage(Message msg) {    	    		switch (msg.what) {    	    		case TASK_BEGIN:    	    			Log.i(TAG, "[H_TID:" +    	    			   Thread.currentThread().getId() + "] Get TASK_BEGIN");    	    			break;    	    			    	    		case TASK_1:    	    			Log.i(TAG, "[H_TID:" +    	    			   Thread.currentThread().getId() + "] Get TASK_1");    	    			break;    	    			    	    		case TASK_2:    	    			Log.i(TAG, "[H_TID:" +    	    			   Thread.currentThread().getId() + "] Get TASK_2");    	    			break;    	    			    	    		case TASK_END:    	    			Log.i(TAG, "[H_TID:" +    	    			   Thread.currentThread().getId() + "] Get TASK_END");    	    			Looper.myLooper().quit();    	    			finish();    	    			break;    	    		}    	    		super.handleMessage(msg);    	    	}    		};    		    		Looper.loop();    	}    	    	public void sendMessageTodoYourWork() {    		Log.i(TAG, "[S_ID:" + Thread.currentThread().getId() + "]" +				"Send TASK_START to handler.");    		// 启动任务(消息只有标识,立即投递)    		workHandler.sendEmptyMessage(TASK_BEGIN);    		Log.i(TAG, "[S_ID:" + Thread.currentThread().getId() + "]" +				"Send TASK_1 to handler.");    		// 开始任务1(在workHandler的消息队列中获取一个Message对象,避免重复构造)    		Message msg1 = workHandler.obtainMessage(TASK_1);    		msg1.obj = "This is task1";    		workHandler.sendMessage(msg1);    		    		Log.i(TAG, "[S_ID:" + Thread.currentThread().getId() + "]" +				"Send TASK_2 to handler.");    		    		// 开启任务2(和上面类似)    		Message msg2 = Message.obtain();    		msg2.arg1 = 10;    		msg2.arg2 = 20;    		msg2.what = TASK_2;    		workHandler.sendMessage(msg2);    		Log.i(TAG, "[S_ID:" + Thread.currentThread().getId() + "]" +				"Send TASK_END to handler.");    		// 结束任务(空消息体,延时2s投递)    		workHandler.sendEmptyMessageDelayed(TASK_END, 2000);    	}    }}

?

运行结果:

e、主/子线程均有一个消息队列,然后相互传递消息(这种方式是最灵活的,双向传递,也不复杂)

package com.dxyh.test;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Looper;import android.os.Message;import android.util.Log;public class MainActivity extends Activity {	private final static String TAG = "HandlerTest";		private final static int TASK_BEGIN		= 1;	private final static int TASK_1		= 2;	private final static int TASK_2		= 3;	private final static int TASK_END		= 4;		private final static int TASK_BEGIN_OVER	= 11;	private final static int TASK_1_OVER	= 12;	private final static int TASK_2_OVER	= 13;	private final static int TASK_END_OVER	= 14;		private Handler workHandler = null;	    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        Log.i(TAG, "[M_TID:" + Thread.currentThread().getId() + "]" +        		"This is in main thread.");                LooperThread testThread = new LooperThread();        testThread.start();                // 注意,这里需要等待一下,防止出现空指针异常        while (null == workHandler) {        }                testThread.sendMessageTodoYourWork();    }      Handler mainHandler = new Handler () {    	// 在每个case之后,不能做耗时的操作    	@Override    	public void handleMessage(Message msg) {    		switch (msg.what) {    		case TASK_BEGIN_OVER:    			Log.i(TAG, "[MH_TID:" +    				Thread.currentThread().getId() + "] TASK_BEGIN_OVER");    			break;    			    		case TASK_1_OVER:    			Log.i(TAG, "[MH_TID:" +    				Thread.currentThread().getId() + "] TASK_1_OVER");    			break;    			    		case TASK_2_OVER:    			Log.i(TAG, "[MH_TID:" +    				Thread.currentThread().getId() + "] TASK_2_OVER");    			break;    			    		case TASK_END_OVER:    			Log.i(TAG, "[MH_TID:" +    				Thread.currentThread().getId() + "] TASK_END_OVER");    			finish();    			break;    		}    		super.handleMessage(msg);    	}    };        class LooperThread extends Thread {    	@Override    	public void run() {    		Looper.prepare();    		    		workHandler = new Handler() {    			// 现在在每个case之后,你可以做任何耗时的操作了    	    	@Override    	    	public void handleMessage(Message msg) {    	    		switch (msg.what) {    	    		case TASK_BEGIN:    	    			Log.i(TAG, "[ZH_TID:" +    	    			   Thread.currentThread().getId() + "] Get TASK_BEGIN");    	    			// 做完之后报告信息给主线程    	    			mainHandler.sendEmptyMessage(TASK_BEGIN_OVER);    	    			break;    	    			    	    		case TASK_1:    	    			Log.i(TAG, "[ZH_TID:" +    	    			   Thread.currentThread().getId() + "] Get TASK_1");    	    			// 做完之后报告信息给主线程    	    			mainHandler.sendEmptyMessage(TASK_1_OVER);    	    			break;    	    			    	    		case TASK_2:    	    			Log.i(TAG, "[ZH_TID:" +    	    			   Thread.currentThread().getId() + "] Get TASK_2");    	    			// 做完之后报告信息给主线程    	    			mainHandler.sendEmptyMessage(TASK_2_OVER);    	    			break;    	    			    	    		case TASK_END:    	    			Log.i(TAG, "[ZH_TID:" +    	    			   Thread.currentThread().getId() + "] Get TASK_END");    	    			Looper.myLooper().quit();    	    			// 做完之后报告信息给主线程    	    			mainHandler.sendEmptyMessage(TASK_END_OVER);    	    			Looper.myLooper().quit();    	    			break;    	    		}    	    		super.handleMessage(msg);    	    	}    		};    		    		Looper.loop();    	}    	    	public void sendMessageTodoYourWork() {    		Log.i(TAG, "[ZS_ID:" + Thread.currentThread().getId() + "]" +				"Send TASK_START to handler.");    		// 启动任务(消息只有标识,立即投递)    		workHandler.sendEmptyMessage(TASK_BEGIN);    		Log.i(TAG, "[ZS_ID:" + Thread.currentThread().getId() + "]" +				"Send TASK_1 to handler.");    		// 开始任务1(在workHandler的消息队列中获取一个Message对象,避免重复构造)    		Message msg1 = workHandler.obtainMessage(TASK_1);    		msg1.obj = "This is task1";    		workHandler.sendMessage(msg1);    		    		Log.i(TAG, "[ZS_ID:" + Thread.currentThread().getId() + "]" +				"Send TASK_2 to handler.");    		    		// 开启任务2(和上面类似)    		Message msg2 = Message.obtain();    		msg2.arg1 = 10;    		msg2.arg2 = 20;    		msg2.what = TASK_2;    		workHandler.sendMessage(msg2);    		Log.i(TAG, "[ZS_ID:" + Thread.currentThread().getId() + "]" +				"Send TASK_END to handler.");    		// 结束任务(空消息体,延时2s投递)    		workHandler.sendEmptyMessageDelayed(TASK_END, 2000);    	}    }}

?以上一到四均摘自:http://blog.csdn.net/dengxiayehu

?

?

  相关解决方案