5

我如何确保异步任务在我运行某些任务之前完成。我需要在异步任务更改该变量的值之后使用一个变量。如果我在异步运行完成之前运行代码,那么我搞砸了。有什么帮助吗?我显然是异步任务的新手。如果您查看我的代码,我可能没有按预期使用 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.
            }
        }
4

2 回答 2

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
        }


    }
}
于 2012-10-19T00:25:28.657 回答
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);


        }
    }

希望这会帮助你。

于 2012-10-19T00:02:40.200 回答