zoukankan      html  css  js  c++  java
  • 利用Handler来更新android的UI

    刚刚开始接触android线程编程的时候,习惯好像java一样,试图用下面的代码解决问题

    Java代码  收藏代码
    1.  new Thread( new Runnable() {     
    2.     public void run() {     
    3.          myView.invalidate();    
    4.      }            
    5. }).start();     

    然而发现这样是不行的,因为它违背了单线程模型:Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。查阅了文档和apidemo后,发觉常用的方法是利用Handler来实现UI线程的更新的。

    下面代码的功能很简单:画一个圆出来,每隔0.1秒,圆向10移动10个像素。但可以清楚展示利用Handler更新UI的流程。

    首先创建简单的View,代码如下:

    Java代码  收藏代码
    1. package com.ray.handler;  
    2.   
    3. import android.content.Context;  
    4. import android.graphics.Canvas;  
    5. import android.graphics.Color;  
    6. import android.graphics.Paint;  
    7. import android.graphics.Point;  
    8. import android.graphics.drawable.Drawable;  
    9. import android.view.View;  
    10.   
    11. public class BounceView extends View {  
    12.     float x = 40;  
    13.       
    14.     public BounceView(Context context) {   
    15.          super(context);   
    16.     }   
    17.   
    18.     @Override   
    19.     protected void onDraw(Canvas canvas) {   
    20.         x+=10;  
    21.         Paint mPaint = new Paint();  
    22.         mPaint.setAntiAlias(true);  
    23.         mPaint.setColor(Color.GREEN);  
    24.         canvas.drawCircle(x, 4040, mPaint);  
    25.     }  
    26. }  

    创建Activity,代码如下:

    Java代码  收藏代码
    1. package com.ray.handler;  
    2.   
    3. import android.app.Activity;  
    4. import android.content.Context;  
    5. import android.graphics.Canvas;  
    6. import android.graphics.Color;  
    7. import android.graphics.Paint;  
    8. import android.os.Bundle;  
    9. import android.os.Handler;  
    10. import android.os.Message;  
    11. import android.view.View;  
    12. import android.view.Window;  
    13.   
    14. public class TestHandler extends Activity {  
    15.      protected static final int GUIUPDATEIDENTIFIER = 0x101;   
    16.        
    17.      Thread myRefreshThread = null;   
    18.      BounceView myBounceView = null;   
    19.    
    20.      Handler myHandler = new Handler() {  
    21.           public void handleMessage(Message msg) {   
    22.                switch (msg.what) {   
    23.                     case TestHandler.GUIUPDATEIDENTIFIER:   
    24.                          myBounceView.invalidate();  
    25.                          break;   
    26.                }   
    27.                super.handleMessage(msg);   
    28.           }   
    29.      };  
    30.      public void onCreate(Bundle savedInstanceState) {   
    31.           super.onCreate(savedInstanceState);   
    32.           this.requestWindowFeature(Window.FEATURE_NO_TITLE);   
    33.    
    34.           this.myBounceView = new BounceView(this);  
    35.           this.setContentView(this.myBounceView);   
    36.           new Thread(new myThread()).start();  
    37.      }   
    38.    
    39.      class myThread implements Runnable {   
    40.           public void run() {  
    41.                while (!Thread.currentThread().isInterrupted()) {    
    42.                        
    43.                     Message message = new Message();   
    44.                     message.what = TestHandler.GUIUPDATEIDENTIFIER;   
    45.                       
    46.                     TestHandler.this.myHandler.sendMessage(message);   
    47.                     try {   
    48.                          Thread.sleep(100);    
    49.                     } catch (InterruptedException e) {   
    50.                          Thread.currentThread().interrupt();   
    51.                     }   
    52.                }   
    53.           }   
    54.      }   
    55. }  
  • 相关阅读:
    类和对象系列教材 (十二)- 怎么写一个Java的饿汉式与懒汉式单例模式
    类和对象系列教材 (十二)- 怎么写一个Java的饿汉式与懒汉式单例模式
    [LeetCode] 285. Inorder Successor in BST
    [LeetCode] 671. Second Minimum Node In a Binary Tree
    [LeetCode] 230. Kth Smallest Element in a BST
    [LeetCode] 238. Product of Array Except Self
    [LeetCode] 273. Integer to English Words
    [LeetCode] 266. Palindrome Permutation
    [LeetCode] 409. Longest Palindrome
    [LeetCode] 124. Binary Tree Maximum Path Sum
  • 原文地址:https://www.cnblogs.com/armysheng/p/2948047.html
Copyright © 2011-2022 走看看