在运行某些任务之前,如何确保异步任务完成。我需要使用变量AFTER异步任务更改该变量的值。如果我在异步完成运行之前运行代码然后我搞砸了。任何帮助?我对异步任务显然很新。如果您查看我的代码,我可能没有使用onPostExecute(),因为它的意图是建议会有所帮助。我最初的想法是继续向异步任务添加内容,但我认为这只是不好的做法,因为我有很多必须连续运行的东西。基本上,我认为归结为:我如何确保UI线程中的任务在我的异步任务完成之前不会开始运行。
public class MainActivity extends MapActivity {
myJSONmap;
public void onCreate(Bundle savedInstanceState) {
new AsyncStuff().execute();
locatePlace(myJSONmap);
class AsyncStuff extends AsyncTask<Void, Integer, JSONObject> {
@Override
protected JSONObject doInBackground(Void... params) {
jObject = GooglePlacesStuff.getTheJSON(formatedURL);
return null;
}
@Override
protected void onPostExecute(JSONObject result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
myJSONmap = JSONextractor.getJSONHMArrayL(jObject); // getting the parsed data from the JSON object.
//the arraylist contains a hashmap of all the relevant data from the google website.
}
}
答案 0 :(得分:4)
您可能想在Android Developer上阅读有关AsyncTask的更多信息
http://developer.android.com/intl/es/reference/android/os/AsyncTask.html
关于提示,我个人的选择是将布尔值传递给onPostExecute。这样你就可以评估doInBackground是否成功,然后找出要做的事情(错误信息或更新布局)。
请注意,在onPostExecute方法中,理想情况下仅会使屏幕更新,假设您的数据正常。在您的示例中,为什么不包含
myJSONmap = JSONextractor.getJSONHMArrayL(jObject);
在doInBackground上?然后致电
locatePlace(myJSONmap);
像这样:
class MyAsyncTask extends AsyncTask<Void, Void, Boolean> {
String errorMsg;
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Integer doInBackground(Void... v) {
try{
jObject = GooglePlacesStuff.getTheJSON(formatedURL);
myJSONmap = JSONextractor.getJSONHMArrayL(jObject);
//do stuff
return true;
} catch (JSONException e){
errorMsg="Something wrong in the json";
return false;
}
}
@Override
protected void onPostExecute(Boolean success) {
if(success){
locatePlace(myJSONmap);
//update layout
} else {
//show error
}
}
}
答案 1 :(得分:1)
您可以使用以下代码执行异步任务 -
MyAsyncTask_a asyncTask_a = new MyAsyncTask_a();
asyncTask_a.execute();
一旦doInBackground()任务完成,那么只有控制权将转到postExecute()。 您无法在doInBackground中执行任何UI操作,但您可以在preExecute()和postExecute()中执行此操作。
class MyAsyncTask_a extends AsyncTask<Void, Void, Integer> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Integer doInBackground(Void... arg0) {
// TODO Auto-generated method stub
return 1;
}
@Override
protected void onPostExecute(Integer result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
}
}
希望这会对你有所帮助。