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開発者の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 に答える