2

私は次のようなメソッドを持っています:

public void doSomething(final int num1, final int num2, final String str) {
    new AsyncTask<Void, Void, Void>() {
        @Override
        protected Void doInBackground(Void... params) {
            reallyComplexStatisticFunction(num1 + num2, str);
        }
    }.execute();
}

(例を大幅に簡略化しました。)

のメソッドdoSomething()内で提供されたパラメータを直接使用するのが賢明ですか?それとも、これはスレッド関連の問題を引き起こしますか?AsyncTaskdoInBackground()

また、3番目のパラメーターが?Contextではなくインスタンスである場合、違いはありますStringか?

4

2 に答える 2

2

いくつかの保証があり、それはそのドキュメントAsyncTaskで見ることができますが、これらは主にのフィールドへのアクセスに関するものです。AsyncTask

あなたの例では、プリミティブと文字列を使用しています。どちらも実際には変更できないので、そのために安全です。

ただし、別のスレッドから変更できるオブジェクトを使用している場合は、呼び出した瞬間からexecute()実際にオブジェクトを使用するまでの間に変更されないことを実際に確認することはできません。内部で読んだときに正しく変更されました。doInBackground()さらに悪いことに、内部で変更しようとすると変更さdoInBackground()れ、破損した状態で終了する可能性があります。このような場合は、同期を使用して、一度に1つのスレッドのみがそのようなオブジェクトを読み取ったり変更したりできるようにする必要があります。

execute()オブジェクトを使用するときまでに呼び出したときのオブジェクトの値/状態を保持する必要がある場合は、オブジェクトのdoInBackground()クローンを作成し、このクローンをスナップショットとして使用することをお勧めします。

于 2013-03-22T23:18:43.173 に答える
0

プリミティブや不変オブジェクトへの参照のみを渡す限り、安全です。それ以外の場合は、他のスレッドがそれらのオブジェクトの状態を変更しないことを確認する必要があります(またはオブジェクトへのアクセスを同期します)。

StringsはJavaで不変であるため、例は問題ないように見えます。

于 2013-03-22T23:11:53.900 に答える