歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android Handler+Thread實現更新Ui

Android不允許activity新啟動的線程訪問該activity裡的界面組件,這樣就導致新啟動的線程無法動態改變界面組件的屬性值,但在實際開發中,尤其設計動畫的游戲開發中,需要讓新啟動的線程周期性的改變界面組件的屬性值,這是就需要借助於Handler的消息傳遞機制來實現了。

Handler類的主要作用有兩個:

1.      在新啟動的線程中發送消息

2.      在主線程中獲取、處理消息

這個過程設計一個問題:新啟動的線程何時發送消息呢?主線程何時去獲取並處理消息呢?

為了讓主線程能“適時”地處理新啟動的線程所發送的消息,顯然只能通過回調的方式來實現,開發者需要做的就是,重寫Handler類中處理消息的方法,當新線程發送消息時,Handler類中處理消息的方法將自動被回調。

Handler類的方法比較多,現列舉幾個常用方法:

1、voidhandleMessage(Message msg) ;用於處理消息的方法,該方法通常用於被重寫

2、final boolean  hasMessages(int what) :檢查消息隊列中是否包含參數what為指定值的消息

3、final boolean  hasMessages(int what, Object object):檢查消息隊列中是否包含參數what為指定值且參數object為指定對象的消息

4、final Message  obtainMessage():從消息池中獲取消息

5、final boolean  sendEmptyMessage(int what):發送空消息

6、final boolean  sendEmptyMessageDelayed(int what, long delayMillis):指定多少毫秒之後發送空消息

7、final boolean  sendMessage(Message msg):立即發送消息

8、final boolean  sendMessageDelayed(Message msg, long delayMillis):指定多少毫秒之後發送消息

程序通過上面幾個方法,就可以實現方便的實現消息傳遞了!

貼上代碼:

package com.test.handler;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;

public class MainActivity extends Activity {
 private int MESSAGE = 1;
 private TextView mTextView;
 private String temp = "線程每隔2秒處理一次";
 private Thread mThread;

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  mTextView = (TextView) findViewById(R.id.handTextView);

  // 僅Thread實現
  thread.start();// 啟動線程

  // //Runnable實現
  // mThread = new Thread(mRunnable);
  // mThread.start();

  // 這個算是最簡潔的方式了
  // mTextView.post(new Runnable() {
  //
  // @Override
  // public void run() {
  // Message message=new Message();
  // message.what=MESSAGE;
  // mHandler.sendMessage(message);
  // }
  // });
 }

 // 由Handler的handleMessage方法處理更新ui
 Handler mHandler = new Handler() {
  @Override
  public void handleMessage(Message msg) {// 該方法在主線程中運行
   super.handleMessage(msg);
   switch (msg.what) {
   case 1:
    mTextView.setText(temp);
    break;
   default:
    break;
   }
  }
 };

 // Thread實現
 Thread thread = new Thread() {
  @Override
  public void run() {// 新創建的線程
   super.run();
   for (int i = 0; i < 100; i++) {
    try {
     sleep(2000);// 暫停2秒再發送消息
     temp = temp + i;
     // 第一種發送消息的方式
     // Message message = new Message();
     // message.what = MESSAGE;
     // mHandler.sendMessage(message);

     // 第二種發送消息的方式,推薦使用這種
     Message message = mHandler.obtainMessage();
     mHandler.obtainMessage(MESSAGE).sendToTarget();

    } catch (InterruptedException e) {
     e.printStackTrace();
    }
   }

  }
 };

 // Runnable實現
 Runnable mRunnable = new Runnable() {
  @Override
  public void run() {
   for (int i = 0; i < 100; i++) {
    try {
     Thread.sleep(2000);// 暫停2秒再發送消息
     temp = temp + i;

     // 第一種發送消息的方式
     // Message message = new Message();
     // message.what = MESSAGE;
     // mHandler.sendMessage(message);

     // 第二種發送消息的方式,推薦使用這種
     Message message = mHandler.obtainMessage();
     mHandler.obtainMessage(MESSAGE).sendToTarget();

    } catch (InterruptedException e) {
     e.printStackTrace();
    }
   }
  }
 };

}

運行一下,就可以看到效果啦,TextView每2秒更新一次!!

更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11

Copyright © Linux教程網 All Rights Reserved