真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Android學習筆記:Handler初步

    

我們提供的服務有:網(wǎng)站建設、成都網(wǎng)站建設、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、土默特左旗ssl等。為近千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術(shù)的土默特左旗網(wǎng)站制作公司

Handler

Handler,它直接繼承自Object,一個Handler允許發(fā)送和處理Message或者Runnable對象,并且會關(guān)聯(lián)到主線程的MessageQueue中。每個Handler具有一個單獨的線程,并且關(guān)聯(lián)到一個消息隊列的線程,就是說一個Handler有一個固有的消息隊列。當實例化一個Handler的時候,它就承載在一個線程和消息隊列的線程,這個Handler可以把Message或Runnable壓入到消息隊列,并且從消息隊列中取出Message或Runnable,進而操作它們。

一下是一個簡單的例子。兩個按鈕只是測試用的。點擊按鈕后,將改變TextView的文字。

package com.jam.testhandler;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

	private Button button1;
	private Button button2;
	private TextView textView;
	private MyHandler handler;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		handler = new MyHandler();
		button1 = (Button) findViewById(R.id.button1);
		button2 = (Button) findViewById(R.id.button2);
		textView = (TextView) findViewById(R.id.textView);
		button1.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Thread t = new MyWorkThread();
				t.start();
			}
		});
		button2.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				TestThread tt = new TestThread();
				Thread thread = new Thread(tt);
				thread.start();
			}
		});
	}

	//集成Thread的方法
	private class MyWorkThread extends Thread {

		@Override
		public void run() {
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			String s = "String from work thread";
			
			//這里我沒弄清楚obtainMessage和new Message的區(qū)別。
//			Message msg = handler.obtainMessage();
			Message msg = new Message();
			
			msg.obj = s;
			handler.sendMessage(msg);
		}
		
	}
	
	//實現(xiàn)Runnable
	//注意Runnable代表線程體而不是一個線程
	private class TestThread implements Runnable {

		@Override
		public void run() {
			Runnable r = new Runnable() {
				
				@Override
				public void run() {
					System.out.println("Thread的名字-->" + Thread.currentThread().getName());
				}
			};
			
			handler.post(r);
		}
		
	}
	
}

  Handler 發(fā)送的 message 到隊列中后,Looper 拿到后會返回到發(fā)送消息的Handler中處理。

  Handler拿到后,在這個例子中,由于Handler是在主線程當中,所以這個機制可以另其他線程處理的東西拿到Handler中,再進行UI的修改。

以下是另一種用法,在新的線程中使用Handler

package com.example.testhandler2;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

	private Button button;
	private TextView textView;
	private Handler handler;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		button = (Button) findViewById(R.id.button);
		textView = (TextView) findViewById(R.id.textView);
		
		button.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Message msg = new Message();
				msg.what = 50;
				handler.sendMessage(msg);
			}
		});
		
		WorkerThread workerThread = new WorkerThread();
		workerThread.start();
	}

	private class WorkerThread extends Thread {

		@Override
		public void run() {
			Looper.prepare();
			handler = new Handler() {

				@Override
				public void handleMessage(Message msg) {
					Log.d("msg", "" + msg.what);
				}
				
			};
			Looper.loop();
		}

	} 
	
}

在點擊按鈕后,使用handler發(fā)送數(shù)據(jù),在另一個線程中把數(shù)據(jù)取出來。

在子線程創(chuàng)建使用Handler要注意固定用法:

先準備Loop

Looper.prepare()

復寫Handler的方法handleMessage

Looper.loop

注意:

Thread代表線程

Runnable代表線程體不是一個線程,線程體傳入線程才能用

Handler在哪個線程生成,Looper就在哪個線程

 

  Handler.post()方法將一個Runnable放入Message的callback中,然后傳入消息隊列。

  Loop取出帶有Runnable的Message后,判斷是否有callback屬性,有則執(zhí)行handleCallback(Message msg),然后在此方法中執(zhí)行run方法,沒有new一個Thread,一般在這個run()方法中寫入需要在UI線程上的操作。

用這樣的機制可以彌補沒有語句塊的缺憾。(oc語言)

另外,有兩遍關(guān)于Handler很好的博文:

Android--多線程之Handler

Android的線程使用來更新UI----Thread、Handler、Looper、TimerTask等


網(wǎng)站欄目:Android學習筆記:Handler初步
URL標題:http://weahome.cn/article/gsdhpi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部