【问题标题】:Java Android :Send data from one thead to another threadJava Android:将数据从一个线程发送到另一个线程
【发布时间】:2012-02-26 04:04:41
【问题描述】:

我在做Android UI Thread,有一个耗时的工作,所以我把它放在另一个线程上。我想要两件事:

1) 在这个子线程运行后,UI Thread 将开始工作A

2)这个workA将获取一些在子线程中创建的数据。

这是我的解决方案:

Car car;    
public void onResume(){
        super.onResume();   
        Thread t = new Thread(){
                car = new Car();
                car.takePetrol;   //take car full petrol
            }
        });

        t.join();
        count_How_far_Car_can_go(car.getPetrol);        

}

我的代码中的问题是:我使用了 t.join();等待线程 t 完成。这将“阻止” UI 线程。当然,这不是我想要的。 (因为我做了另一个线程,所以 UI Thread 仍然可以顺利工作)

谁对我的问题有其他解决方案,请帮助我:)

谢谢:)

【问题讨论】:

  • 而且,我仍然信任 StackOverFlow 社区 ...
  • 如果您想要某种方式与 GUI 线程交互,下面的答案似乎是 AsyncTask 的方式。我个人使用标准 Java 线程并使用 Producer-Mediator-Consumer 模型在 GUI 和其他线程之间发送消息。 jaiswaltraining.com/DesignPatterns/ch13.php

标签: java android multithreading sendmessage


【解决方案1】:

android.os.AsyncTask 包中查看AsyncTask 类。

编辑: 抱歉快速回答。我已根据 OP 的需要对其进行了改进。

private class MyTask extends AsyncTask<Void, Void, Car> {
        @Override
        protected Car doInBackground() {
            // Create your Car here
            return car;
        }

        @Override
        protected void onPostExecute(Car car) {
            // This will be executed on UI thread after completion
        }
}

然后像这样触发它

MyTask task = new MyTask();
task.execute();

如果您需要将参数传递给您的AsyncTask,您可以将您的参数对象添加到类定义中,当然也可以在执行任务时传递您的参数对象。

private class MyTaskWithParams extends AsyncTask<String, Void, Car> {
        @Override
        protected Car doInBackground(String parameter) {
            // Create your Car using the String you passed
            return car;
        }

        @Override
        protected void onPostExecute(Car car) {
            // This will be executed on UI thread after completion
        }
}

将参数添加到定义中,您应该实例化

MyTask2 task2 = new MyTask2();
task2.execute("SomethingSomething");

【讨论】:

  • 认真的吗?该示例代码与 OP 的要求有什么关系?如果他们以前从未使用过AsyncTask,那只会让事情变得混乱。至少给出一个AsyncTask 示例,该示例与他们正在尝试做的事情有一定的相关性。
  • @MisterSquonk 抱歉复制粘贴混乱。我以一种可以理解的方式改进了我的答案。
  • 哦。非常感谢 :) 在您编辑之前,我必须阅读一篇很长且难以理解的文章!!!!在此之后,我再次阅读了我更容易看到的帖子。
【解决方案2】:

使用AsyncTask 并输入...

car = new Car();
car.takePetrol;   //take car full petrol

...进入doInBackground 方法。完成后,将调用 onPostExecute 方法,您可以在其中执行“workA”。

【讨论】:

    【解决方案3】:

    ConditionVariable&ExecutorService更适合这个场景。 see here for android blog

    【讨论】:

      猜你喜欢
      • 2013-12-02
      • 1970-01-01
      • 2017-05-08
      • 1970-01-01
      • 2015-08-29
      • 2015-10-19
      • 2014-01-15
      • 2011-12-16
      • 2011-07-19
      相关资源
      最近更新 更多