Android------多线程、线程通信、handler机制
- 模拟网络请求,会阻塞主线程
java
private String getStringForNet() {
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < 100; i++) {
stringBuilder.append("字符串" + i);
}
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return stringBuilder.toString();
}
- 常规做法(会导致页面无法交互)
java
public void handleStart(View view) {
String str = getStringForNet();
tv_content.setText(str);
}
- 使用多线程
java
public void handleStart(View view) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
String str = getStringForNet();
tv_content.setText(str);//会有问题
}
});
thread.start();
}
这样,我们的主线程不会阻塞,在执行这个任务后,页面也可以正常交互,但是在子线程中不能操纵页面,所以 tv_content.setText(str)
会有问题,所以我们需要进程通信。
- 线程通信
在Activity中定义一个Handler
java
private Handler mHandler = new Handler(Looper.myLooper()) {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if (msg.what == 0) {
String strData = (String) msg.obj;
tv_content.setText(strData);
ToastUtil.show(ThreadActivity.this,"任务完成");
}
}
};
通过 mHandler 发送消息
java
@Override
public void run() {
String str = getStringForNet();
Message message = new Message();
message.what = 0;
message.obj = str;
mHandler.sendMessage(message);
}
- Handler 异步通信系统
- handler 多线程通信机制
案例代码