UI线程与子线程通信示例 日记
个人日记
package com.example.appthread_test;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private Handler SON_handler;
TextView tx1, tx2;
Button button;
int i = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button);
tx1 = (TextView) findViewById(R.id.textView);
tx2 = (TextView) findViewById(R.id.textView2);
button.setOnClickListener(new btn_click());
SON_Thread();//启动子线程
}
class btn_click implements View.OnClickListener { //定义一个类实现监听的接口
public void onClick(View v) {
Message SON_msg = SON_handler.obtainMessage();//绑定子线程消息句柄
SON_msg.what = 0;
SON_msg.obj = "UI线程发出的消息" + i++;
SON_handler.sendMessage(SON_msg);
}
}
private Handler MAIN_Handler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(@NonNull Message msg) {
if (msg.what == 0) {
//收到子线程消息后,实现自己的任务
tx1.setText((String) msg.obj);
}
}
};//接受处理自定义消息(处理UI线程任务)
public void SON_Thread() {
new Thread(new Runnable() {
@SuppressLint("HandlerLeak")
@Override
public void run() {
Looper.prepare();//将SON_handler绑定到当前的子线程
SON_handler = new Handler() {
@Override
public void handleMessage(Message msg) {
tx2.setText((String) msg.obj);
if (msg.what == 0) {
//收到UI线程消息后,实现自己的任务
Message Main_msg = MAIN_Handler.obtainMessage();//绑定主线程消息句柄
Main_msg.what = 0;
Main_msg.obj = "子线程回复消息" + i++;
MAIN_Handler.sendMessage(Main_msg);
}
}
};
//死循环!只能靠消息驱动!
//退出使用SON_Thread.getLooper().quit();
Looper.loop();//需要让looper动起来去消息队列中抽取消息
}
}).start();
}
}