只有在异步任务完成后才需要运行任务

时间:2012-10-18 22:55:51

标签: java android multithreading android-asynctask http-post

在运行某些任务之前,如何确保异步任务完成。我需要使用变量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.
            }
        }

2 个答案:

答案 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);


        }
    }

希望这会对你有所帮助。