android向工作线程发送消息

标签 android multithreading thread-safety

我有一个线程,我需要在其中定期执行一些检查、从 Web 获取文件并向主 UI 线程发送消息。我什至需要在工作线程的每个循环中使用 UI 线程参数(如 map 可见区域)。所以我想我需要在 UIthread 和 workerThread 之间实现双向通信。 另一个问题是我需要保存添加到 map 的每个标记的标识符。我想将 map.addMarker 的结果保存在我的工作线程中存储的自定义数组中。这意味着从我更新 map 的 uithread 中,我应该告诉 workerThread 更新标记数组。

这是我实际工作线程的示例:

 class MyThread extends Thread {
     private Handler handler;
     private  MainActivity main;

     public MyThread (MainActivity mainClass, Handler handlerClass) {
         this.main=mainClass;
         this.handler = handlerClass;   
     }

     @Override
     public void run(){
            while(true){
               sleep(2000);
               //do my stuffs
               //....
               //prepare a message for the UI thread
               Message msg = handler.obtainMessage();
               msg.obj= //here i put my object or i can even use a bundle
               handler.sendMessage(msg); //with this i send a message to my UI thread

            }
     }
 }

我的实际问题是,当 UI 线程结束处理从工作线程接收到的消息时,我应该在工作线程上执行操作。

我想到了 2 个解决方案:

1)在工作线程上等待直到UI线程处理完消息

2)在UI线程上处理消息,然后将消息发送到工作线程。

我不知道如何做解决方案 1,所以我尝试了解决方案 2。我尝试通过这种方式向我的工作线程(RUN sub)添加一个循环程序:

 class MyThread extends Thread {
     private Handler handler;
     private  MainActivity main;

     public MyThread (MainActivity mainClass, Handler handlerClass) {
         this.main=mainClass;
         this.handler = handlerClass;   
     }

     @Override
     public void run(){
            Looper.prepare();
            mHandler = new Handler() {
                 public void handleMessage(Message msg) {
                      // Act on the message received from my UI thread doing my stuff
                 }
            };
            Looper.loop();
            while(true){
               sleep(2000);
               //do my stuffs
               //....
               //prepare a message for the UI thread
               Message msg = handler.obtainMessage();
               msg.obj= //here i put my object or i can even use a bundle
               handler.sendMessage(msg); //with this i send a message to my UI thread

            }
     }
 }

问题是在 Looper.loop() 之后没有一行代码被执行。我读到这是正常的。我读了很多文章,但我不明白我应该如何允许执行我的 while 循环,并同时处理来 self 的 UI 线程的消息。 我希望问题很清楚。建议我最好的解决方案。

最佳答案

不要这样做:

while(true){
    sleep(2000);

它在很多层面上都非常糟糕。如果您需要一些后台处理,请使用 AsyncTasks,如果您需要重复事件,请使用:

private Handler mHandler = new Handler();

private Runnable mSomeTask = new Runnable() {
    public void run() {
        doSomething();
    }
};

然后在代码的某处:

mHandler.postDelayed(mSomeTask, 100);

这将使您的程序运行得更快,占用更少的资源,基本上成为更好的 Android 公民。

关于android向工作线程发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16264683/

相关文章:

android - 使用蓝牙自动将文件传输到android中的配对设备

java - Android:获取一个已经启动的定时器

c++ - 具有两个原子的自旋锁的最小限制内存排序

wpf - 为什么第二个 UI 线程会卡住第一个?

ruby - Rails - 美洲狮 worker 的并发问题

android - 如何清除 Jetpack Compose 中的文本字段值?

c# - MySql - 多线程软件,如何锁定行以防止其他线程读取

java - 互斥的java方法执行(不是全部)

java - Java 中的线程安全访问枚举

android - 改造2中的响应{协议(protocol)= http/1.1,代码= 404,消息=未找到,url = https://sub.domain.com}