Android子线程与子线程的通信

原理也是Android异步消息处理机制,请看我的这篇博客

https://blog.csdn.net/yh18668197127/article/details/86224318

 

示例代码

接收信息的线程:

public class Runnable1 implements Runnable {
    private static final String TAG = "Runnable1";
    private Handler handler;

    public Handler getHandler() {
        return handler;
    }
    @SuppressLint("HandlerLeak")
    @Override
    public void run() {

        Log.i(TAG, "run: 线程1开始");
        Looper.prepare();
        handler = new Handler(){
            public void handleMessage(Message msg) {
                //这里处理消息
                Log.i(TAG, "handleMessage:收到消息 "+msg.what);
                //只接受一次消息就退出Looper循环
                handler.getLooper().quit();
            };
        };
        Looper.loop();
        Log.i(TAG, "run: "+Process.myTid());
    }
}

 传递信息的线程:

public class Runnable2 implements Runnable {

    private static final String TAG = "Runnable2";

    private Handler handler;

    public Runnable2(Handler handler) {
        this.handler = handler;
    }

    @Override
    public void run() {
        Log.i(TAG, "run: 线程2开始");
        Message message=new Message();
//        Message message=Message.obtain();(这种方法更好,节省资源)
        message.what=1;
        handler.sendMessage(message);
        Log.i(TAG, "run: "+Process.myTid());
    }
}

调用处:第一个button开启接收线程,第二个button开启发送线程

//子线程和子线程通信
public class Main2Activity extends AppCompatActivity {
    private static final String TAG = "Main2Activity";
    private Runnable1 runnable1;
    private Runnable2 runnable2;
    private Handler r1Handler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        
        runnable1=new Runnable1();

        Button button2=findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //接收信息的线程
                new Thread(runnable1).start();
                //该线程用于两个通信线程之间Handler的传递工作
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        Log.i(TAG, "run: 该线程用于两个通信线程之间Handler的传递工作");
                        r1Handler=runnable1.getHandler();
                        if (r1Handler==null){
                            try {
                                Thread.sleep(250);
                                r1Handler=runnable1.getHandler();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                        runnable2=new Runnable2(r1Handler);
                    }
                }).start();
            }
        });

        Button button3=findViewById(R.id.button3);
        button3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //传递信息的线程
                new Thread(runnable2).start();
            }
        });
    }
}

 

查看日志打印

Android子线程与子线程的通信_第1张图片

符合预期,子线程1成功接收到了子线程2的消息 

你可能感兴趣的:(Android代码库)