天天看點

Android多線程知識點

多線程:包括程序、線程。

程序:一個Android應用就就是一個程序,每個應用在各自的程序中進行。(通常說的關閉手機某個應用程序)

線程:比程序更小的獨立運作的基本機關,一個程序可以包含多個線程。如:微信程序app,消息聊天界面包括:對話界面(UI線程)、播放語音(子線程)、下載下傳視訊(子線程)、接收消息(子線程)。

注:子線程也稱Worker線程。

一、Handler

1.初識Handler

例子:點選按鈕使文本框内容發生改變

//報錯:Only the original thread that created a view hierarchy can touch its views.
void onClick(View v){
	//建立的一個新線程
	Thread thread=new Thread(new Runnable(){
		public void run(){
			textview.setText("文本内容改變");
		}
	});
	thread.start();//開啟線程
}
           

分析原因:

子線程不允許操作主線程中的元件,應該由按鈕通知handler,再由handler更新UI元件。

Android多線程知識點

修改後:

//主線程中定義handler(android.os包中)
Handler handler =new Handler(){
	public void handleMessage(Message msg){//重寫匿名内部類
		super.handleMessage(msg);
		if(msg.what==0x123){//擷取消息代碼,判斷
			textview.setText("文本内容改變");
		}
	}
};
//在點選事件裡
public void run(){
	handler.sendEmptyMessage(0x123);//發送空消息
}
           

總結:Handler是android中提供的一個消息處理機制。

作用:1.在任意線程中發送消息。2.在主線程中擷取并處理消息。

使用Handler執行周期性指定任務:

final int TIME=60;//定義時間長度60s
final int TIMER_MSG=0x001;//消息代碼
private int mProgressStatus=0;//定義任務條完成進度

handler.sendEmptyMessage(TIMER_MSG);//在onCreate()方法中,啟動進度條

Handler handler=new Handler(){
	@Override
	public void handleMessage(Message msg){
		super.handleMessage(msg);
		if(TIME-mProgressStatus>0){//目前進度大于0
			mProgressStatus++;//進度加1
			timer.setProgress(TIME-mProgressStatus);//timer為Progress執行個體化對象,更新進度
			handler.sendEmptyMessageDelayed(TIMER_MSG,1000);//1000毫秒後發送消息
		}else{
			Toast.makeText(MainActivity.this,"時間到",Toast.LENGTH_SHORT).show();
		}
	}
};
           

使用Handler和Message實作輪播廣告:

步驟:布局管理、通過ViewFlipper元件播放廣告圖檔、建立Handler對象,實作3秒更新一次圖檔、開啟廣告輪播。

final int FLAG_MSG=0x001;//消息代碼
private Message message;//聲明消息對象
/*************在onCreate()中**************/
message.=Message.obtain();//擷取Message對象
message.what=FLAG_MSG;//設定消息代碼
handler.sentMessage(message);//發送消息
/*******在主線程中建立Handler對象,實作3秒更新一次圖檔****************/
Handler handler=new Handler(){
	@Override
	public void handleMessage(Message msg){
		super.handleMessage(msg);
		if(msg.what==FLAG_MSG){
			flipper.showPrevious();//切換到下一張圖檔
			message=handler.obtainMessage(FLAG_MSG);//擷取Message
			handler.sendMessageDelayed(message.3000);//延遲3秒發送消息
		}
	}
}
           

二、Looper

不斷從消息隊列MessageQueue中擷取Message,傳回給Handler

handler:主線程:系統自動建立Looper對象 子線程:手動建立Looper對象

子線程中建立Looper對象的步驟:初始化Looper對象:prepare()方法->建立handler對象:new Handler()->啟動Looper(從消息隊列中擷取、處理消息)->loop()

LooperThread.java(建立一個子線程)

public class LooperThread extends Thread{
	public Handler handler;//聲明一個Handler對象 
	@Override
	public void run(){
		super.run();
		Looper.prepare();//初始化Looper對象!!!!!!!!!!!
		handler=new Handler(){
		@Override
		public void handlerMessage(Message msg){
			super.handleMessage(msg);
				Log.i("Looper",String.valueOf(msg.what));//輸出一條日志,标記為Looper
			}
		};
		Message message=handler.obtainMessage();//擷取Message
		message.what=0x7;//設定消息代碼
		handler.sendMessage(message);//發送消息
		Looper.loop();//啟動Looper
	}
}
           

MainActivity.java中

/************在onCreate()中*****************/
	LooperThread thread=new LooperThread();//建立一個線程
	thread.start();//開啟線程
           

結果:locat中顯示: Looper:7

https://blog.csdn.net/chunqiuwei/article/details/52251242

https://blog.csdn.net/wsq_tomato/article/details/80301851