原
Android间隔1秒刷新UI指定控件的方法
2018年02月08日 11:45:31 Android凯 阅读数:3908
版权声明:欢迎转载,转载请注明出处!谢谢! https://blog.youkuaiyun.com/sxk874890728/article/details/79286299
有时候,我们需要定时刷新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.youkuaiyun.com/download/sxk874890728/10245400