我正在使用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仍然能够顺利运行)
谁有我的问题的另一个解决方案,请帮助我:)
谢谢:)
答案 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