在非UI線程中使用Handler實現請求隊列


Handler是Android中非常重要的類之一,通過Handler可以實現主線程的延時操作和線程之間的通信,通過在子類中的Handle、和Looper可以很輕松的實現一個請求隊列。

在寫代碼之前首先簡要的說一下 Handler、Looper、MessageQuene之間的關系。

每一個線程最多有一個Looper、一個Looper里邊含有一個MessageQuene。

Handler每次將消息發送到MessageQuene中,Looper用過一個死循環不斷的從MessageQuene中獲取消息,獲取后,根據Message的target分發給對應的Handler進行處理。

下邊是我寫的一個通過Handler和Looper實現的請求隊列:

package com.hou.looper;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;

public class DemoLooperActivity extends Activity {
	private MyThread myThread = new MyThread();

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		/*********** 模擬兩個任務 ***********/
		postToNoneUIThread(new Runnable() {

			@Override
			public void run() {
				try {
					Log.e("", "5 start");
					Thread.sleep(5000);
					Log.e("", "5 end");
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		});
		postToNoneUIThread(new Runnable() {

			@Override
			public void run() {
				try {
					Log.e("", "1 start");
					Thread.sleep(1000);
					Log.e("", "1 end");
				} catch (InterruptedException e) {
					e.printStackTrace();
				}

			}
		});
		/*********** 模擬兩個任務OVER ***********/

	}

	public void runOnNoneUIThread(Runnable r) {
		new Thread(r).start();
	}

	/**
	 * 放入到子線程隊列中
	 * */
	public void postToNoneUIThread(Runnable r) {
		// 執行到這里的時候,子線程可能尚未啟動,等待子線程啟動,等待的時間會很短,
		while (myThread.handler == null) {
		}
		myThread.handler.post(r);
		myThread.handler.sendEmptyMessage(100);
	}

	/**
	 * 可以設計為網絡請求隊列
	 * */
	class MyThread extends Thread {
		{
			start(); // 類加載完成后直接啟動
		}
		private Handler handler;

		@Override
		public void run() {
			while (true) {

				Looper.prepare(); // 創建該線程的Looper對象
				handler = new Handler(Looper.myLooper()) {
					public void handleMessage(android.os.Message msg) {
						Log.i("handleMessage", "" + msg.what);
					};
				};

				Looper.loop(); // 這里是一個死循環
				// 此后的代碼無法執行
			}
		}
	}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM