Android的訊息處理:Looper,Handler和Message
阿新 • • 發佈:2019-02-15
Handler例項:
子類需要繼承Hendler類,如果是處理Message資料,並必須要重寫handleMessage(Message msg)方法。
以下為一個例項,它實現的功能為:通過執行緒修改介面Button的內容
public class MyHandlerActivity extends Activity { Button button; MyHandler myHandler; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.handlertest); button = (Button) findViewById(R。id。button); //無引數的建構函式,預設用了本執行緒的looper,所以如果是在非ooper執行緒裡要先prepare()把當前執行緒變為looper執行緒,讓咱通過loop()方法啟動迴圈 myHandler = new MyHandler();//如果在子執行緒中要生成主執行緒的可以寫new Handler(Looper.getMainLooper()) //當建立一個新的Handler例項時, 它會繫結到當前執行緒和訊息的佇列中,開始分發資料 //Handler有兩個作用, (1) : 定時執行Message和Runnalbe 物件 (2): 讓一個動作,在不同的執行緒中執行。 //myHandler.post(Runnable) //myHandler.postAtTime(Runnable,long) //myHandler.postDelayed(Runnable,long) //以上方法以post開頭的允許你處理Runnable物件,把Runnable物件排入MessageQueue //myHandler.sendEmptyMessage(int) //myHandler.sendMessage(Message); //myHandler.sendMessageAtTime(Message,long) //myHandler.sendMessageDelayed(Message,long) //myHandler.sendMessage()//允許你處理Message物件(Message裡可以包含資料),需要重寫handleMessage(Message msg)方法 MyThread m = new MyThread(); new Thread(m).start(); } /** * 接受訊息,處理訊息 ,此Handler會與當前主執行緒一塊執行 * */ class MyHandler extends Handler { public MyHandler() { } public MyHandler(Looper L) { super(L); } //子類必須重寫此方法,接受資料 @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub Log.d("MyHandler", "handleMessage。。。。。。"); super.handleMessage(msg); // 此處可以更新UI Bundle b = msg.getData(); String color = b.getString("color"); MyHandlerActivity.this.button.append(color); } } class MyThread implements Runnable { public void run() { try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } Log.d("thread......", "mThread....."); Message msg = new Message(); Bundle b = new Bundle();// 存放資料 b.putString("color", "我的"); msg.setData(b); MyHandlerActivity.this.myHandler.sendMessage(msg); // 向Handler傳送訊息,更新UI } } }