这是一个让我困惑的问题,我想得到答案。
我们已经扩展了应用程序,并且该类具有要从应用程序的不同区域访问的变量。我认为这样做是为了获得单例实现。该应用程序具有不同类的成员对象。
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(从 Activity A 启动)中更新trial
变量的值,如下所示,
mDataApplication = (DataApplication) ((FragmentActivity)context).getApplication();
InfoHelper infoHelper = mDataApplication.getInfoHelper();
infoHelper.trial = 200;
当 AsyncTask 完成时,在 Activity-A 中,我trial
使用在调用 AsycTask 之前创建的 InfoHelper 变量检查变量的值,
// 下面是在Activiy-A的onCreate()中创建的,在AsyncTask启动之前。
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
我期待第一个 Log 语句的第一个结果,但我没想到第二个 log 语句可以让我得到更新的结果。那是怎么发生的?在 AsyncTask 中更新时,我创建了一个 InfoHelper 对象并更新了该对象。怎么到处反映。我的朋友说这是因为它是对象的相同引用,如果我们创建 InfoHelper 的对象并不重要,因为它是相同的内存位置,如果这是真的,那么问题就是为什么第一个 Log 语句向我展示了旧值?
我在这方面的基础薄弱,我很感激这可能有助于我变得更好。
注意:如果我在打印之前再次创建 mInfoHelper 对象,我就会得到我期望发生的更新值。
mInfoHelper = mScanApplication.getInfoHelper();
Log.d(TAG, "Test Value 1 --- "+ mInfoHelper.trial);
结果是,测试值 1 --- 200