これは私を困惑させている問題であり、答えを得たいと思っていました。
アプリケーションを拡張し、クラスにはアプリのさまざまな領域からアクセスされる変数があります。これは、シングルトンの実装を取得するために行われたと思います。アプリケーションには、さまざまなクラスのメンバー オブジェクトがあります。
public class DataApplication extends Application{
public InfoHelper mInfoHelper;
public void setHelper (InfoHelper infoHelper) {
mInfoHelper = infoHelper;
}
public InfoHelper getInfoHelper() {
if (mInfoHelper == null){
mInfoHelper = new InfoHelper();
}
return mInfoHelper;
}
// InfoHelper クラス
public class InfoHelper{
public int trial = 10;
}
AsyncTask (アクティビティ A から開始される) では、次のtrial
ように変数の値を更新します。
mDataApplication = (DataApplication) ((FragmentActivity)context).getApplication();
InfoHelper infoHelper = mDataApplication.getInfoHelper();
infoHelper.trial = 200;
AsyncTask が完了すると、Activity-A 内で、trial
AsycTask を呼び出す前に作成された InfoHelper 変数を使用して変数の値を確認し、
// 以下は、AsyncTask が開始される前に、Activiy-A の onCreate() で作成されます。
mInfoHelper = mScanApplication.getInfoHelper();
// Asyctask が完了したら、trial の値を確認します。
Log.d(TAG, "Test Value 1 --- "+ mInfoHelper.trial);
Log.d(TAG, "Test Value 2--- "+ mDataApplication.getInfoHelper().trial);
結果は、 テスト値 1 --- 10 テスト値 2 --- 200
最初のログ ステートメントからの最初の結果を期待していましたが、2 番目のログ ステートメントで更新された結果が得られるとは思っていませんでした。どうしてこうなりました?AsyncTask で更新する際に、InfoHelper のオブジェクトを作成し、そのオブジェクトを更新しました。どうしてあちこちに反映されたのでしょう。私の友人は、それはオブジェクトの同じ参照であり、InfoHelper のオブジェクトを作成しても同じメモリ位置であるため問題ではないと言いました。それが本当なら、問題はなぜ最初の Log ステートメントが古い値を教えてくれましたか?
私の基礎はこの分野で弱いので、より良くなるために私の探求に役立つかもしれないことに感謝しています.
注: 印刷する直前に mInfoHelper オブジェクトを再度作成すると、予期していた値が更新されます。
mInfoHelper = mScanApplication.getInfoHelper();
Log.d(TAG, "Test Value 1 --- "+ mInfoHelper.trial);
結果は、テスト値 1 --- 200