使用handler 实时更新。
Handler为android系统的线程通信工具,承担着主线程与分线程,分线程之间的通信功能,经常用到的有post(),sendMessage() 方法,前者是将一个线程加入线程队列,后者是发送一个消息到消息队列中,post方法还有两个变种,分别为定时发送postAtTime()和延时发送postDelayed()。
计时功能的实现主要利用了postDelayed()函数,即在run函数中以一秒为延时,不断调用自身,直到外部结束线程。
- public class HandlerDemoActivity extends Activity {
- /** Called when the activity is first created. */
- Count count;
- int i = 0;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- count = new Count();
- handler.post(count);
- }
- class Count implements Runnable{
- @Override
- public void run() {
- Log.i("count",String.valueOf(i++));
- handler.postDelayed(count, 1000);
- }
- };
- final Handler handler = new Handler(){
- @Override
- public void handleMessage(Message msg) {
- super.handleMessage(msg);
- }
- };
- }
static Handler mHandler = new Handler();
mHandler.post(mRunnable); //使用handler将runnable线程加入到线程队列。
static String str ="0.0 MB/s"; 要实时显示的内容。 在主线程中改变要显示的内容,在另一个runnable线程中把这个要显示的内容刷新。
使用handler在线程运行中
private Runnable mRunnable = new Runnable() {
public void run() {
text.setText(str);比如说从网上获取一个网页,在一个TextView中将其源代码显示出来,这种涉及到网络操作的程序一般都是需要开一个线程完成网络访问,但是在获得页面源码后,是不能直接在网络操作线程中调用TextView.setText()的.因为其他线程中是不能直接访问主UI线程成员 。
android提供了几种在其他线程中访问UI线程的方法。
Activity.runOnUiThread( Runnable )
View.post( Runnable )
View.postDelayed( Runnable, long )
Hanlder
这些类或方法同样会使你的代码很复杂很难理解。然而当你需要实现一些很复杂的操作并需要频繁地更新UI时这会变得更糟糕。
mHandler.postDelayed(mRunnable, 1000); //这么做可以每隔1s调用自身。
}
};