JavaAndroid:将数据从一个线程发送到另一个线程

JavaAndroid:将数据从一个线程发送到另一个线程,java,android,multithreading,sendmessage,Java,Android,Multithreading,Sendmessage,我在安卓UI线程上工作,有一个耗时的工作,所以我把它放在另一个线程上。我想要两样东西: 1此子线程运行后,UI线程将开始执行工作 2该工作将获取在子线程中创建的一些数据 以下是我的解决方案: Car car; public void onResume(){ super.onResume(); Thread t = new Thread(){ car = new Car(); car.ta

我在安卓UI线程上工作,有一个耗时的工作,所以我把它放在另一个线程上。我想要两样东西:

1此子线程运行后,UI线程将开始执行工作

2该工作将获取在子线程中创建的一些数据

以下是我的解决方案:

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线程仍然可以顺利工作

谁能为我的问题提供另一种解决方案,请帮助我:

谢谢:

使用一个

car = new Car();
car.takePetrol;   //take car full petrol
…进入doInBackground方法。完成后,将调用onPostExecute方法,您可以在其中执行“workA”。

使用并放置

car = new Car();
car.takePetrol;   //take car full petrol
…进入doInBackground方法。完成后,将调用onPostExecute方法,您可以在其中执行“workA”。

从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
        }
}
如果需要向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
        }
}
从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
        }
}
如果需要向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
        }
}
ConditionVariable&ExecutorService更适合此场景。

条件变量和执行器服务更适合此场景。

真的吗?这个示例代码与OP的要求有什么关系?如果他们以前从未使用过AsyncTask,这只会让事情变得混乱。至少给出一个AsyncTask示例,该示例与他们试图做的事情有一定的关联。@MisterSquonk为混乱的复制粘贴感到抱歉。我以一种可以理解的方式改进了我的答案。非常感谢:在你编辑之前,我必须读一篇很长很难理解的文章!!!在这之后,我又读了一遍我更容易看到的帖子。真的吗?这个示例代码与OP的要求有什么关系?如果他们以前从未使用过AsyncTask,这只会让事情变得混乱。至少给出一个AsyncTask示例,该示例与他们试图做的事情有一定的关联。@MisterSquonk为混乱的复制粘贴感到抱歉。我以一种可以理解的方式改进了我的答案。非常感谢:在你编辑之前,我必须读一篇很长很难理解的文章!!!在这之后,我再次阅读了我更容易看到的那篇文章。而且,我仍然信任StackOverFlow社区……如果您想以某种方式与GUI线程交互,下面的答案似乎是使用AsyncTask的方法。我个人使用标准Java线程,并使用生产者-中介者-消费者模型向GUI和其他线程发送消息。而且,我仍然信任StackOverFlow社区……如果您想以某种方式与GUI线程交互,下面的答案似乎是AsyncTask的解决方法。我个人使用标准Java线程,并使用生产者-中介者-消费者模型向GUI和其他线程发送消息。