7

ネットワーク接続にAsyncTaskを使用する必要があるAndroidアプリケーションを開発しています。メインスレッドから呼び出しました。したがって、doInBackgroundメソッドが実行されてから、onPostExecuteメソッドに戻ります。onPostExecuteメソッドが実行された後、onPostExecuteメソッドから返された値を必要とする特定のアクティビティで何らかの操作を行う必要があるため、呼び出し元のアクティビティに値を戻したいと思います。どうすればこれを解決できますか?onPostExecuteから値を返すにはどうすればよいですか?

前もって感謝します

4

3 に答える 3

8

AsyncTaskは、その名前が示すように、UIスレッドと非同期で実行されており、doInBackgroundが終了したときに、将来のある時点でonPostExecuteメソッドが呼び出されます。onPostExecuteメソッドがいつ呼び出されるかは関係ありません(実際には、プロジェクトのビルド時に通知する方法はありません)。onPostExecuteメソッドは、将来のある時点で基盤となるフレームワークによって適切に呼び出されることが保証されているだけです。したがって、onPostExecuteメソッドの目的は、ワーカースレッドから返された結果を処理することです。これが、onPostExecuteメソッドの唯一の引数がdoInBackgroundメソッドから返された結果である理由でもあります。

onPostExecuteメソッドから返される値を必要とする特定のアクティビティで何らかの操作を行う必要があります。どうすればこれを解決できますか?

当然のことながら、Activityクラスでいくつかのインスタンス変数を作成する(またはlisternerパターンを使用する)と、onPostExecuteメソッドで返され準備ができたときに結果が保存されます。問題は、この結果が実際にアプリの実行時に決定されるため、プロジェクトのビルド時にonPostExecuteメソッドの外部でいつ準備ができるかわからないことです。結果を継続的にポーリングする待機メカニズムを作成しない限り、結果としてAsyncTaskの利点が犠牲になります。たとえば、組み込みAPI AsyncTask.get()により、AsyncTaskがUIスレッドと同期して実行され、結果がActivityに返されます。

ベストプラクティスは、デザインを変更し、AsyncTaskから返される結果を必要とする操作コードをonPostExecuteメソッドに移動することです。お役に立てれば。

于 2012-04-04T06:04:45.310 に答える
5

値を取り戻すためにgetterとsetterを使用できますAsyncTask

public class MainActivity extends Activity {
    public String retunnumfromAsyncTask;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layouttest);
        new Asyntask(this).execute();
    }

    public class Asyntask extends AsyncTask<Void, Void, String> {
        private final Context Asyntaskcontext;

        public Asyntask(Context context){
            Asyntaskcontext = context;
        }

        @Override
        protected void onPostExecute(String result) {
            MainActivity mainactivity = (MainActivity) Asyntaskcontext;
            mainactivity.retunnumfromAsyncTask = result;       
            super.onPostExecute(result);
        }
    }
}
于 2012-04-04T05:35:18.927 に答える
1

次に、AsyncTaskクラスをアクティビティの内部クラスとして記述し、グローバルとして返したい値を宣言します。役に立ちましたか?

于 2012-04-04T11:28:15.237 に答える