如何利用Handler更新android的UI
提出問題
新手剛開始接觸Android線程編程的時候,會想到如下使用如下代碼:
複製到剪貼板 Java代碼
- new Thread( new Runnable() {
- public void run() {
- myView.invalidate();
- }
- }).start();
但是:該實現方法是不可行的。
分析問題:
因為:Android UI操作並不是線程安全的,這些操作必須在UI線程中執行。
1.myView.invalidate()是UI操作;
2.new Thread創建了一個新的線程,是一個子線程,而不是UI線程,在這個新的線程裏麵對view進行刷新,這樣是不安全的。
解決問題:
那麼如何解決這個問題呢?
答案:使用Handler來實現UI線程的更新的。
實現步驟:
1.在view類裏麵定義一個Handler變量,這並沒有開啟一個新的線程,因此在handler裏麵更新本view是安全的;
2.然後我們創建一個線程,通過這個線程來給activity的handler變量發送消息,同時通過這個線程進行延時。
意即:
1.Handler接收消息和處理消息;
2.創建一個線程,來給Handler發送消息;
消息處理三部曲:
1.發送消息;
2.接收消息;
3.處理消息;
代碼參考
首先創建簡單的View,代碼如下:
複製到剪貼板 Java代碼
- package com.ray.handler;
- import android.content.Context;
- import android.graphics.Canvas;
- import android.graphics.Color;
- import android.graphics.Paint;
- import android.graphics.Point;
- import android.graphics.drawable.Drawable;
- import android.view.View;
- public class BounceView extends View {
- float x = 40;
- public BounceView(Context context) {
- super(context);
- }
- @Override
- protected void onDraw(Canvas canvas) {
- x+=10;
- Paint mPaint = new Paint();
- mPaint.setAntiAlias(true);
- mPaint.setColor(Color.GREEN);
- canvas.drawCircle(x, 40, 40, mPaint);
- }
- }
創建Activity類,代碼如下:
複製到剪貼板 Java代碼
- package com.ray.handler;
- import android.app.Activity;
- import android.content.Context;
- import android.graphics.Canvas;
- import android.graphics.Color;
- import android.graphics.Paint;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Message;
- import android.view.View;
- import android.view.Window;
- public class TestHandler extends Activity {
- protected static final int GUIUPDATEIDENTIFIER = 0x101;
- Thread myRefreshThread = null;
- BounceView myBounceView = null;
- Handler myHandler = new Handler() {//在主線程中創建Handler對象
- public void handleMessage(Message msg) {//處理消息
- switch (msg.what) {
- case TestHandler.GUIUPDATEIDENTIFIER://
- myBounceView.invalidate();//UI界麵更新
- break;
- }
- super.handleMessage(msg);
- }
- };
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- this.requestWindowFeature(Window.FEATURE_NO_TITLE);
- this.myBounceView = new BounceView(this);
- this.setContentView(this.myBounceView);
- new Thread(new myThread()).start();//創建一個子線程
- }
- //線程類,這個線程隻是發送消息,然後延時而已。
- class myThread implements Runnable {
- public void run() {
- while (!Thread.currentThread().isInterrupted()) {
- Message message = new Message();
- message.what = TestHandler.GUIUPDATEIDENTIFIER;
- TestHandler.this.myHandler.sendMessage(message); //發送一次消息,自動調用上麵handler類的handleMessage函數,從而更新view類。
- try {
- Thread.sleep(100); //延時
- } catch (InterruptedException e) {
- Thread.currentThread().interrupt();
- }
- }
- }
- }
- }
最後更新:2017-04-02 06:51:48