簡而言之一些比較耗時的操作不要在主線程中等待,而是實現非同步載入,比如那些下載的操作,如果檔案小,網速快,可能一下也完了。。要是檔案大了,網速不給力,勢必拖垮主線程,使用者體驗也差。於是android中使用handler來處理這些事情。 xml中定義兩個button: <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:id="@+id/start" android:layout_height="wrap_content" android:layout_width="fill_parent" android:text="@string/start" /> <Button android:id="@+id/stop" android:layout_height="wrap_content" android:layout_width="fill_parent" android:text="@string/stop" /> </LinearLayout> HanderActivity.java繼承自Activity.java package com.myandroid.handler; import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button; public class HanderActivity extends Activity { /** Called when the activity is first created. */ Button startButton = null; Button endButton = null; Handler handler = new Handler(); /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); startButton = (Button)findViewById(R.id.start); startButton.setOnClickListener(new StartListener()); endButton = (Button)findViewById(R.id.stop); endButton.setOnClickListener(new EndListener()); System.out.println(Thread.currentThread()); } class StartListener implements OnClickListener{ @Override public void onClick(View arg0) { // TODO Auto-generated method stub handler.post(HandlerThread); } } class EndListener implements OnClickListener{ @Override public void onClick(View arg0) { // TODO Auto-generated method stub handler.removeCallbacks(HandlerThread); } } //匿名內部類一個線程 Runnable HandlerThread = new Runnable() { @Override public void run() { // TODO Auto-generated method stub System.out.println("HandlerThread is Running......"); System.out.println(Thread.currentThread()); handler.postDelayed(HandlerThread, 3000); } }; } ①,當start按鈕按下的時候,handler會通過執行代碼handler.post(HandlerThread)把HandlerThread線程加入到handler的線程隊列中,執行線程的run()方法, ②,在run()方法中,handler.postDelayed(HandlerThread, 3000)再次將線程放入handler隊列,設定延時3000ms,這樣是整個線程每個3000ms列印出:HandlerThread is Running...... ③但是,在這裡其實還是在一個線程裡面,通過 System.out.println(Thread.currentThread())的輸出結果可以看出都是主線程 2,要實現handler非同步 1,Message類 每個訊息都有一個隊列,隊列中存放的就是Message對象,obtainMessage()來獲得訊息對象。同時,Message對象是用來傳遞使用的,它能傳遞兩個整型和一個Object,盡量使用Message的arg1與arg2兩個整型來傳遞參數,那樣系統消耗最小(API如是說),如果傳遞資料量比較大,則可以使用setData(Bundle a)的方法,其中的Bundle對象可以粗略的看成是一個Map對象,但它的Key都是String,而value是有限的一些類型,可以再API裡查看。 2,Looper類 Looper能夠迴圈滴從訊息佇列中取得訊息,一般通過thread的getLooper()方法獲得一個Looper對象 package com.myandroid.handler; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.HandlerThread; import android.os.Looper; import android.os.Message; public class MessageLooperHandler extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); System.out.println("Activity---->"+Thread.currentThread().getName()); //建立一個HandlerThread對象,它是一個線程 HandlerThread handlerThread = new HandlerThread("HandlerThread"); //啟動線程 handlerThread.start(); //建立一個MyHandler對象,該對象繼承了Handler,從下面的MyHandler類中可以看到, //調用的是Handler父類的Handler(Looper looper)的建構函式,而這裡傳進去的Looper對象是從HandlerThread中取得的。 MyHandler myHandler = new MyHandler(handlerThread.getLooper()); //獲得訊息對象 Message msg = myHandler.obtainMessage(); //把得到的訊息對象發送給產生該訊息的Handler,即myHandler, //當myHandler接收到訊息後,就會調用其handleMessage的方法來處理訊息 msg.sendToTarget(); } class MyHandler extends Handler{ public MyHandler() {//建構函式 // TODO Auto-generated constructor stub } public MyHandler(Looper looper){//建構函式 super(looper);//實現了父類的該建構函式 } //當這個Handler接收到Message對象的時候,會自動調用這個方法,來對Message對象進行處理 @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub System.out.println("Handler---->"+Thread.currentThread().getName()); } } } 這時運行MessageLooperHandler這個Activity可以看到:是兩個線程了 實現與主線程的分離,從而可以實現多線程和非同步處理。