这是一个困扰我的问题,我想得到答案。
我们扩展了应用程序,并且类具有可从应用程序的不同区域访问的变量。我认为这是为了获得单例实现。该应用程序具有不同类的成员对象。
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完成后,我会检查试验的价值。
Log.d(TAG, "Test Value 1 --- "+ mInfoHelper.trial);
Log.d(TAG, "Test Value 2--- "+ mDataApplication.getInfoHelper().trial);
结果是, 测试值1 --- 10 测试值2 --- 200
我期待第一个Log语句的第一个结果,但我没想到第二个日志语句会给我更新结果。那是怎么发生的?在AsyncTask中更新时,我创建了一个InfoHelper对象并更新了该对象。它怎么会到处反映出来。我的朋友说,这是因为它是对象的相同引用,如果我们创建InfoHelper的对象并不重要,因为它是相同的内存位置,如果这是真的那么问题就是为什么第一个Log语句向我展示了旧的价值?
我的基本面在这方面很弱,我很感激可能有助于我变得更好。
注意:如果我在打印之前再次创建mInfoHelper对象,我会得到我期望发生的更新值。
mInfoHelper = mScanApplication.getInfoHelper();
Log.d(TAG, "Test Value 1 --- "+ mInfoHelper.trial);
结果是, 测试值1 --- 200