很久没写笔记了,今天总结一下Android中多线程更新UI
如下通过按钮启动Thread,在主线程通过handler更新textView的数据变化

/**
* @author SuTongsheng
* @create 2019/1/22
* @Describe 在线程中更新UI
*/
public class ThreadUiActivity extends AppCompatActivity {
@BindView(R.id.tv_num)
TextView tvNum;
@BindView(R.id.bt_start)
Button btStart;
@BindView(R.id.bt_stop)
Button btStop;
private static final int NUM1 = 0x21;
private static final int NUM2 = 0x22;
private int tempNum = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_thread_ui);
ButterKnife.bind(this);
}
@SuppressLint("HandlerLeak")
private Handler myHandle = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case NUM1:
tvNum.setText(msg.obj + "");
break;
case NUM2:
tempNum++;
tvNum.setText(tempNum + "");
break;
default:
break;
}
}
};
@OnClick({R.id.tv_num, R.id.bt_start, R.id.bt_stop})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.tv_num:
break;
case R.id.bt_start:
// new MyThread().start();//1
// new Thread(new Runnable() {//2 匿名内部类
// @Override
// public void run() {
//
// }
// }).start();
new Thread(new MyRunnable()).start();//3
break;
case R.id.bt_stop:
new MyThread().start();//1
break;
}
}
public class MyRunnable implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(100);
Message message = new Message();//传递数据
message.what = NUM1;
message.obj = i;
myHandle.sendMessage(message);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(100);
myHandle.sendEmptyMessage(NUM2);//记录标志,区分标记更新UI
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
代码中创建子线程用了三种方法,继承Thread、实现Runnable和匿名内部类
更新UI用了通过handler.sendEmpty发送标记给UI主线程,通过标记识别更新处理UI。以及handler.sendMessage,通过创建message对象,赋值msg.what设置标记,msg.obj传递参数更新UI。
其中的XML文件如下
<?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:orientation="vertical"
tools:context=".activity.ThreadUiActivity">
<TextView
android:id="@+id/tv_num"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/bt_start"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="开始1" />
<Button
android:id="@+id/bt_stop"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="开始2" />
</LinearLayout>
网友评论