UI thread and child thread communication example diary

UI thread and child thread communication example diary

Personal diary

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();
    }
}

Guess you like

Origin blog.csdn.net/kk1271/article/details/109299632