asynctaskからそれらにアクセスしたい場合は、静的オブジェクトをコピーする必要がありますか?
-
28-09-2019 - |
質問
使用するプロジェクトがあります AsyncTask
バックグラウンドで仕事を成し遂げるため。
また、このプロジェクトは、データベースキーなどの静的値の一般的なホルダーとしてクラスを使用しますが、プロジェクト全体の1つまたは2つの有用なオブジェクトにも使用されます。このクラスが呼ばれているとしましょう public class Constants
.
これらのオブジェクトの1つにアクセスしたい AsyncTask
, 、そして、私はそれをコピーする必要があるかどうかわかりません。
私は実際にエラーやクラッシュを取得していませんが、再現できないクラッシュを報告するユーザーのフィードバックがいくつかありますので、これで何か間違ったことをしています。
私の現在の処理はこれです:
onStart() {// somewhere in the UI thread
new MyTask(Constants.theObject).execute(); // (1)
}
// ...
class MyTask extends AsyncTask<...> {
MyObjectType object;
MyTask(MyObjectType theObjectInstance) {
object = theObjectInstance; // (2)
// ...
doInBackground() { // (3)
// ...
}
の (1)
, Constants.theObject
アプリケーションスタートアップで作成された静的オブジェクトです
の (2)
, 、既存の静的オブジェクトへの参照を取得します Constants.theObject
の (3)
, 、私たちはもはやUIスレッドにいません、そして私はアクセスしたいです Constants.theObject
(メインスレッドでも使用されている可能性があります)
.
3つの可能なケースがあると思います。
- このコードは醜いです、そうでなければ私はすべきです
- このコードは大丈夫です、ユーザーのフィードバックはこれに関するものではありません
- このコードは非常に問題ありませんが、のコピーを作成する必要があります
Constants.theObject
で使用したい場合doInBackground
;それ以外の場合は失敗する可能性があります
私はあなたが私を助けることができることを願っています!読んでくれてありがとう。
解決
あなたが書いたものから、私はあなたがコピーを作る必要はないと思います。 MyObjectType
スレッドセーフではありません。その場合、一度に1つのスレッドのみがそれを変更していることを確認する必要があります。 (コピーを作ることは確かにこれを解決するでしょうが、もしあなたがコピーを作ることができれば、とにかくあなたが使用すべきことは本当にグローバルな静的ですか?)
オブジェクトが初期化された後にのみ1と3が発生できると100%確信していますか?
他のヒント
複数のスレッドが同じオブジェクトを変更しようとしているためかもしれません。予期しない結果/完全な障害を引き起こす可能性があります。ロックを使用して、2つのスレッドが同時にオブジェクトを更新できるようにすることができます。この場合、Asynchの操作はすべて正確なintanceに依存するため、速度が低下します。理由で静的オブジェクトを使用していると思います。可能であれば、他の方法でそれを行うことを検討することをお勧めします。