Java Android:将数据从一个thead发送到另一个线程

时间:2012-02-26 04:04:42

标签: java android multithreading sendmessage

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

1)在这个子线程运行之后,UI Thread将开始做workA

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();等待线程完成。这将“阻止”UI线程。当然,这不是我想要的。 (因为我创建了另一个线程,因此UI Thread仍然能够顺利运行)

谁有我的问题的另一个解决方案,请帮助我:)

谢谢:)

3 个答案:

答案 0 :(得分:3)

AsyncTask包中查看android.os.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");

答案 1 :(得分:1)

使用AsyncTask并输入...

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

...进入doInBackground方法。完成后,调用onPostExecute方法,您可以在那里执行'workA'。

答案 2 :(得分:0)

ConditionVariable&amp; ExecutorService更适合此场景。  see here for android blog