0

这是一个让我困惑的问题,我想得到答案。

我们已经扩展了应用程序,并且该类具有要从应用程序的不同区域访问的变量。我认为这样做是为了获得单例实现。该应用程序具有不同类的成员对象。

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

4

0 回答 0