1

静的メソッドを持つユーティリティクラスがあります。これらのメソッドがバックグラウンドタスクを実行できると仮定すると、次のようになります。

class ExampleAsyncUtil {
    public static void doSomeAsyncJob() {
        new AsyncTask<Void, Void, Void> () {

            @Override
            protected Void doInBackground (Void... params) {
                //do heavy job here ...
                return null;
            }
        }.execute();
    }
}

その場合、アクティビティ内でutilクラスメソッドを呼び出します。これはその後破棄されます。

class ExampleActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ExampleAsyncUtil.doSomeAsyncJob();
    }

    @Override
    protected void onDestroy() {

        //should i stop async task in util on destroy ?

        super.onDestroy();
    }
}

害はありますか?(バックグラウンドスレッドがユーティリティメソッドを呼び出したアクティビティへの参照を保持しないと仮定します)

4

1 に答える 1

0

はい、UI から AsyncTask をキャンセルする必要があります。それ以外の場合は AsyncTask をリークできます(経験から言えば)。そして、おそらく、同じスレッドで別のスレッドが開始されるのをブロックすることさえあります。実装を変更し続けます: http://developer.android.com/reference/android/os/AsyncTask.html。または、逆に、複数の onCreate() が重複した「ゾンビ」AsyncTask を作成する可能性があります。とにかく、これは AsyncTask の意図された使用法ではありません: それらは短命で適切に制御されるはずです。したがって、その静的なビジネスには本当の利益はないようです。

アクティビティのライフサイクル内で、サービスを開始してそこからトレッドを生成するか、伝統的に AsyncTask を使用する必要があると思います。

ここに非同期処理に関する優れたチュートリアルがあります: http://www.vogella.com/articles/AndroidPerformance/article.html

于 2012-09-20T10:18:54.827 に答える