Android间隔1秒刷新UI指定控件的方法

有时候,我们需要定时刷新UI界面的某个控件,比如轮循播放某个消息或者通知等等。这里简短总结一下:

 首先,将公共的东西放在BaseActivity里面,其代码

public abstract class BaseActivity extends Activity {
   public ViewPager viewPager;
   public ProgressBar progressBar;
   public TextView textView;
   public int progress = 0;
   @SuppressLint("HandlerLeak")
   public Handler mHandler = new Handler() {
      @Override
      public void handleMessage(Message msg) {
         super.handleMessage(msg);
         switch (msg.what) {
         case 0:
            reFreshUi(progress);
            break;
         }
      }
   };

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      progressBar = (ProgressBar) findViewById(R.id.pb_test);
      textView = (TextView) findViewById(R.id.tv_time);
      viewPager = (ViewPager) findViewById(R.id.vp_test);
      Integer[] items = { R.drawable.test1, R.drawable.test2, R.drawable.test3};
      viewPager.setAdapter(new ViewPagerAdapter(items, this));
   }

   public void reFreshUi(int progress) {
      setProgressBar(progress);
      setTextView(progress);
      setViewPager(progress);
   }

   public void setProgressBar(int progress) {
      if (progress > 10) {
         progress = progress % 10;
      }
      progressBar.setProgress(progress);
   }

   public void setTextView(int progress) {
      if (progress < 10) {
         textView.setText("0" + progress);
      } else {
         textView.setText(progress + "");
      }
   }

   public void setViewPager(int progress) {
      if (progress > 3) {
         int current = progress % 3;
         viewPager.setCurrentItem(current);
      } else {
         viewPager.setCurrentItem(progress);
      }
   }

   public abstract void start(View v);

   public abstract void stop(View v);
}

1.使用runOnUiThread(runnable)方法更新UI,不过这里不能进行耗时操作,所以不能用来定时刷新。

2.使用AsyncTask+while(boolen)方式定时更新UI,核心代码如下:

private class MyAsyncTask extends AsyncTask{

    @Override
    protected Object doInBackground(Object[] objects) {
        while (running){
            try {
                progress++;
                publishProgress();// 类似于给主线程发消息,通知更新UI
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        return null;
    }

     @Override
     protected void onProgressUpdate(Object[] values) {
         reflashUI(progress);
         super.onProgressUpdate(values);
     }
  }

3.使用Handler的postDelay()的方法更新UI,不解释,代码如下:

public class HandlerPostDelayActivity extends BaseActivity {

    private Runnable runnable = new Runnable() {
        @Override
        public void run() {
            progress++;
            reflashUI(progress);
            mHandler.postDelayed(runnable,1000);
        }
    };

    @Override
    public void start(View v) {
        stop(v);
        mHandler.post(runnable);
    }

    @Override
    protected void onDestroy() {
        stop();
        super.onDestroy();
    }

    @Override
    public void stop(View v) {
        stop();
    }

    private void stop() {
        mHandler.removeCallbacks(runnable);
    }
}

4.使用Thread+Handler来更新UI,代码如下:

public class ThreadWithHandlerActivity extends BaseActivity {

    private Thread thread;
    @Override
    public void start(View v) {
        startThread();
    }

    @Override
    public void stop(View v) {
        stopThread();
    }

    private void startThread(){
        running =true;
        thread = new Thread(new Runnable() {
            @Override
            public void run() {
                while (running){
                    try {
                        progress++;
                        //reflashUI(progress);//这样更新会出错,不能在子线程更新UI
                        Message message = new Message();
                        message.what = 0;
                        mHandler.sendMessage(message);
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });

        thread.start();
    }

    private void stopThread(){
        if (thread!=null){
            running = false;
            thread.interrupt();
            thread.stop();
            thread=null;
        }
    }

    @Override
    protected void onDestroy() {
        stopThread();
        super.onDestroy();
    }
}

5.使用Timer+Handler的方式更新UI,代码如下:

public class TimerWithHandlerActivity extends BaseActivity {

    Timer timer = new Timer();

    @Override
    public void start(View v) {
        timer.schedule(timerTask,0,1000);//0为延迟时间,1000为间隔时间,(单位:毫秒)
    }

    @Override
    public void stop(View v) {
        stop();
    }

    private void stop() {
        timer.cancel();
        timerTask = null;
        timer = null;
    }

    @Override
    protected void onDestroy() {
        stop();
        super.onDestroy();
    }

    TimerTask timerTask = new TimerTask() {
        @Override
        public void run() {
            progress++;
            Message message = new Message();
            message.what = 0;
            mHandler.sendMessage(message);
        }
    };
}

对于我这种不喜欢写文档的人,真是蛋疼。所以,直接上代码,下面是代码连接:

http://download.csdn.net/download/sxk874890728/10245400


  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值