Android 子线程中更新 UI
虽然这个大家都已经很清楚,但是,为了方便我自己查看,还是记录一下
为了方便,我把 六种子线程中更新 UI 的方式都写在了一个 xml 文件中
先贴 activity 代码:
public class UIupdateActivity extends BaseActivity {
@ViewById(R.id.tv_1)
private TextView mTv1;
@ViewById(R.id.tv_2)
private TextView mTv2;
@ViewById(R.id.tv_3)
private TextView mTv3;
@ViewById(R.id.tv_4)
private TextView mTv4;
@ViewById(R.id.tv_5)
private TextView mTv5;
@ViewById(R.id.tv_6)
private TextView mTv6;
Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
// 子线程更新 UI 方式 1:处理接收到的 message
if (msg.what == 1){
mTv1.setText("handler 发送 message 更新 UI");
}
}
};
@Override
protected void initData() {
}
@Override
protected void initView() {
}
@Override
protected void setContentView() {
setContentView(R.layout.activity_ui_update);
}
@OnClick(R.id.tv_1)
public void uiUpdate1(){
// 子线程更新 UI 方式 1:使用 handle 发送 message,通知主线程更新 UI
new Thread(new Runnable() {
@Override
public void run() {
Message msg = Message.obtain();
msg.what = 1;
mHandler.sendMessage(msg);
}
}).start();
}
@OnClick(R.id.tv_2)
public void uiUpdate2(){
// 子线程更新 UI 方式 2:使用 View.post 更新 UI
new Thread(new Runnable() {
@Override
public void run() {
mTv2.post(new Runnable() {
@Override
public void run() {
mTv2.setText("View.post 更新 UI");
}
});
}
}).start();
}
@OnClick(R.id.tv_3)
public void uiUpdate3(){
// 子线程更新 UI 方式 3:使用 handle.post() 更新 UI
new Thread(new Runnable() {
@Override
public void run() {
mHandler.post(new Runnable() {
@Override
public void run() {
mTv3.setText("handle.post 更新 UI");
}
});
}
}).start();
}
@OnClick(R.id.tv_4)
public void uiUpdate4(){
// 子线程更新 UI 方式 4:使用 handle.postDelayed() 更新 UI
new Thread(new Runnable() {
@Override
public void run() {
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mTv4.setText("handle.postDelayed() 更新 UI");
}
}, 2000);
}
}).start();
}
@OnClick(R.id.tv_5)
public void uiUpdate5(){
// 子线程更新 UI 方式 5:使用 runOnUiThread 更新 UI
new Thread(new Runnable() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
mTv5.setText("runOnUiThread 更新 UI");
}
});
}
}).start();
}
@OnClick(R.id.tv_6)
public void uiUpdate6(){
// 子线程更新 UI 方式 6:使用 AsyncTask 更新 UI
// 手动调用execute(Params... params),执行异步线程任务
// 有几个需要注意的地方:
// 1、必须在UI线程中调用 2、同一个AsyncTask实例对象只能执行1次,若执行第2次将会抛出异常
new updateAsyncTask().execute();
}
/**
* 三个参数为3个泛型参数指定类型;若不使用,可使用 java.lang.Void 类型代替
* 这里指定为:输入参数 = String类型、执行进度 = Integer类型、执行结果 = String类型
*/
class updateAsyncTask extends AsyncTask<String, Integer, String>{
@Override
protected String doInBackground(String... strings) {
publishProgress();
return null;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
mTv6.setText("AsyncTask 更新 UI");
}
}
}
然后是 布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/tv_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="UI Update 1"
android:gravity="center"
android:padding="20dp" />
<TextView
android:id="@+id/tv_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="UI Update 2"
android:gravity="center"
android:padding="20dp" />
<TextView
android:id="@+id/tv_3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="UI Update 3"
android:gravity="center"
android:padding="20dp" />
<TextView
android:id="@+id/tv_4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="UI Update 4"
android:gravity="center"
android:padding="20dp" />
<TextView
android:id="@+id/tv_5"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="UI Update 5"
android:gravity="center"
android:padding="20dp" />
<TextView
android:id="@+id/tv_6"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="UI Update 6"
android:gravity="center"
android:padding="20dp" />
</LinearLayout>