用Thread实现异步更新UI。
Thread的使用简单方便,当Thread被实例化后,实例化的线程与UI主线程通信有一下几种方法:
1.使用Activity包含的Handler的post()方法与UI线程通信;
2.使用Activity类的runOnUiThread()方法;
3.view类的post()和postDelayed()方法与UI通信。
示例代码:
布局文件activity_main.xml:
<TextView
android:id="@+id/counter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="80dp"
android:layout_marginTop="134dp"
android:text=" "/>
代码文件:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final TextView tv = (TextView)findViewById(R.id.counter);
new Thread(new Runnable(){
@Override
public void run() {
int i = 0;
while(i < 10){
SystemClock.sleep(1000);
i++;
final int curI = i;
tv.post(new Runnable(){
@Override
public void run() {
tv.setText(curI+"% complete");
}
});
}
tv.setText("OK!");//注意这句,会有error产生
}
}).start();
}
以上代码中有句直接在非UI线程总修改UI,报错
android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
由此可见,确实是非UI线程无法直接修改UI的,只能通过其他方式。
修改这句(tv.setText("OK!");)如下:
tv.post(new Runnable(){
@Override
public void run() {
tv.setText("OK!");
}
});