Android常用的3种定时刷新UI的方法和子线程能否刷新UI那些事

从Java来看我们可以结合Timer,TimerTask,Handler来实现定时刷新,但是,从Android来说建议用Handler,Runnable。(我们把Timer,TimerTask, Handler的方法以下命名为A方法。 Handler,Runnable命名为B方法)。
在这里说下,实现一个功能有多种方法,每种方法都有自己的特点,所以不必纠结别人实现的比自己好,而放弃自己的东西。功能实现必须从无到有,慢慢优化,取人之长补己之短。才能慢慢进步。(呵呵扯淡..)。
在Android UI操作时经常会启动一个Thread来刷新UI,通常会出现以下异常:
01-07 09:25:38.920: E/AndroidRuntime(12696): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
从上层角度来看,该异常的原因是Android的子线程中不允许刷新UI,UI操作必须放在主线程中(main)。这里大家可以参照B方法的实现,
从底层角度来看,其实子线程并非不能刷新UI的,请参照 http://www.oschina.net/question/54100_29585,该blog对子线程刷新UI,做了详细的讲解,这里就不再重复了,有意向了解的童鞋可以参考下。

不过还是建议使用B方法去实现UI刷新的操作。

不扯淡了,先看代码吧:


package com.example.pythonzz;


import java.util.Timer;
import java.util.TimerTask;


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


public class MainActivity extends Activity {
    TextView text1,text2, text3;
    Button button;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        text1 = (TextView) findViewById(R.id.info1);
        text2 = (TextView) findViewById(R.id.info2);
        text3 = (TextView) findViewById(R.id.info3);
        button = (Button)findViewById(R.id.button1);
        //第一种刷新Timer,TimerTask
        timer.schedule(new TimerTask() {
            
            @Override
            public void run() {
                handler.sendEmptyMessage(0);
            }
        }, 0, 1000);//延时0秒后每隔1秒刷新一次。
        //结束timer调用:
      //timer.cancel();  
        
        //第二种mHandler.postDelayed(runnable, 1000);
        mHandler.removeCallbacks(runnable);
        mHandler.postDelayed(runnable, 1000);
        //结束mHandler调用
      //mHandler.removeCallbacks(runnable);  
        
        //第三种调用2次showHandler.sendMessageDelayed(message, 1000);形成循环。
        startShowUI();
        //取消startShowUI()的调用
      //showHandler.removeMessages(0);
    }
    
    //第一种方法
    Timer timer = new Timer();
    private int temp1 = 0;
    private Handler handler = new Handler(){
        public void handleMessage(Message msg) {
            text1.setText("count temp1 = " + temp1);
            temp1++;
        };
    };
    
     //第二种方法
    private int temp2 = 0;
    private Handler mHandler = new Handler();
    
    private Runnable runnable = new Runnable() {
        
        @Override
        public void run() {
            text2.setText("count temp2 = " + temp2);
            temp2++;
            mHandler.postDelayed(runnable, 1000);
        }
    };
    
    //第三种方法
    private Handler showHandler;
    private int temp3 = 0;
    private void startShowUI(){
        showHandler = new Handler(){
          @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            text3.setText("count temp3 = " + temp3);
            temp3++;
            Message message = handler.obtainMessage(0); 
            showHandler.sendMessageDelayed(message, 1000);
        }  
        };
        Message message = handler.obtainMessage(0); 
        showHandler.sendMessageDelayed(message, 1000);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值