Android的程序启动时,会同时启动一条主线程,又称为UI线程,主要负责UI相关的操作,包括:按键事件、触屏事件以及屏幕绘图事件等等。UI线程应该尽量避免耗时操作,否则将出现著名的ANR异常(Application Not Reponse)。
但是,有时候需要实现UI的动态更新,而更新操作可能又是耗时的。此时,耗时操作则必须放在新线程里进行。下面以一个简单例子,讨论一下UI动态更新的方法。
一、Handler + Thread
直接上代码
package com.dale.uiupdate;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.ImageView;
public class MainActivity extends Activity {
ImageView mIv;
Handler mHandler1 = new Handler() {
@Override
public void handleMessage(Message msg) {
mIv.getDrawable().setLevel(msg.what);
}
};
class Thread1 extends Thread {
@Override
public void run() {
try {
for(int i=0; i!=10; i++) {
mHandler1.sendEmptyMessage(i%3);
sleep(1000);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mIv = (ImageView) findViewById(R.id.iv);
//通过新开线程发送消息给Handler,由Handler来更新当前UI状态
new Thread1().start();
}
}
界面布局时分简单,仅一个ImageView
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android: