【问题标题】:Android getter setter returns null data?Android getter setter 返回空数据?
【发布时间】:2013-01-21 12:57:52
【问题描述】:

我有一类 ApplicationDetails,带有 getter 和 setter 方法。

public class ApplicationDetails {
    String supportURL;
    String companyURL;
    String copyRightText;

    // with getter and setter methods 

}

我正在我的初始屏幕活动中设置所有数据。

ApplicationDetails appDetails = new ApplicationDetails();
String supportURL = getResources().getString(R.string.support_url);
appDetails.setSupportURL(supportURL);

对于示例,我只是从字符串文件中设置数据,但在应用程序中它来自不同的来源。

但是当我尝试访问不同活动中的数据时,它返回空值。 例如

public class AboutViewController extends Activity {

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ApplicationDetails appDetails = new ApplicationDetails();
        System.out.println(" app support url " + appDetails.getSupportURL());
    }

}

输出

I/System.out(2242):  app support url null

任何帮助。

【问题讨论】:

  • 您创建一个 new ApplicationDetails 对象并从中读取。 当然它将具有默认值,而不是您之前在完全不同的对象上设置的值。
  • 在尝试类似的事情之前,您需要了解一些有关 java、oop 和一般编程的知识。
  • 你可以通过单人班来实现你的目标theserverside.de/singleton-pattern-in-java

标签: java android setter getter getter-setter


【解决方案1】:

你得到 null,因为你创建了一个新对象并且所有字段都初始化为零。

在您的情况下,我看到这些字段在应用程序中将是相同的,因此您可以使用Singleton 模式并为您的应用程序仅实例化一个对象并稍后引用它。您不需要在每次引用它时都创建一个新对象。这个类没问题,你也可以让它们成为常量。 (我猜这些变量不会通过执行而改变)

【讨论】:

    【解决方案2】:

    作为快速解决方案,您可以将 supportURL 对象设为静态,但这不是好的解决方案。

    public class ApplicationDetails {
    static String supportURL;
    static String companyURL;
    static String copyRightText;
    
    // with getter and setter methods 
    

    }

    更好的解决方案是在启动 AboutViewController 活动时将字符串从一个活动传递到另一个活动。

    【讨论】:

      【解决方案3】:

      您可以使用共享首选项来存储要通过您的应用程序使用的数据。 这里构造函数中的 Context 就是你的 Activity。

      public class ApplicationDetails {
      
              public static final String SUPPORT_URL = "support_url"; 
              public static final String COMPANY_URL = "company_url";
              public static final String COPYRIGHT_URL = "copyright_url";
      
              String supportURL;
              String companyURL;
              String copyRightText;
              private Context context;
      
              public ApplicationDetails(Context context) {
                  super();
                  this.context = context;
              }
      
              private String getPreference(String key)
              {
                  return PreferenceManager.getDefaultSharedPreferences(context).getString(key, null);
              }
      
              private void setPreference(String key, String value)
              {
                  PreferenceManager.getDefaultSharedPreferences(context).edit().putString(key, value).commit();
              }
      
              public String getSupportURL() {
                  if(supportURL == null)
                      supportURL = getPreference(SUPPORT_URL);
                  return supportURL;
              }
      
              public void setSupportURL(String supportURL) {
                  this.supportURL = supportURL;
                  setPreference(SUPPORT_URL, supportURL);
              }
      
              public String getCompanyURL() {
                  if(supportURL == null)
                      supportURL = getPreference(COMPANY_URL);
                  return companyURL;
              }
      
              public void setCompanyURL(String companyURL) {
                  this.companyURL = companyURL;
                  setPreference(COMPANY_URL, companyURL);
              }
      
              public String getCopyRightText() {
                  if(copyRightText == null)
                      copyRightText = getPreference(COPYRIGHT_URL);
                  return copyRightText;
              }
      
              public void setCopyRightText(String copyRightText) {
                  this.copyRightText = copyRightText;
                  setPreference(COPYRIGHT_URL, copyRightText);
              }
          }
      

      【讨论】:

        【解决方案4】:

        感谢大家的所有建议。现在我只使用一个类的一个实例。

        public class ApplicationDetails {
        
        private static ApplicationDetails instance = null;
        
        String supportURL;
        String companyURL;
        String copyRightText;
        
        // with getter and setter methods 
        
        public static ApplicationDetails getInstance() {
         if (instance == null) {
            instance = new ApplicationDetails();
         }
           return instance;
         }
        

        }

        我正在设置并变得像这样

         ApplicationDetails appDetails = ApplicationDetails.getInstance();
         appDetails.setSupportURL(supportURL);
        

        在活动中

        ApplicationDetails appDetails = ApplicationDetails.getInstance();
        appDetails.getSupportURL();
        

        一切正常。

        【讨论】:

        • 这始终不是一个好的解决方案。由于 android 框架的设计方式是它可以在内存较少时杀死您的应用程序。在这种情况下,您将获得所有字段的 null 并且您必须再次设置字符串。
        【解决方案5】:

        更新

        当您在启动画面中设置值时,内存中的对象是不同的,而在另一个活动中,您创建的另一个对象在内存中也不同,这就是您得到 null 的原因。

        如果这是您在初始屏幕中初始化 url 并在另一个屏幕中使用的要求,那么有很多方法。

        1. 当您进入初始屏幕时,您可以直接在 Activity 中获取字符串。
        2. 在初始屏幕中,将 appDetails 对象设为公共静态对象,以便您也可以在其他活动中访问
        3. 在 ApplicationDetails 上实现序列化并将此对象放入 putExtra 中,因为我们将字符串、int 等值用于在活动之间传递数据并在启动的活动中使用捆绑包获取此数据

        已编辑

        对于使用单个对象,您需要将该对象声明为在初始屏幕中的公共静态

        public static ApplicationDetails appDetails;
        

        现在在初始屏幕 oncreate() 中分配值并在另一个活动甚至另一个类中使用也这样

        public class AboutViewController extends Activity {
        
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
        
                // direct use object by class name
                System.out.println(" app support url " + SplashScreen.appDetails.getSupportURL());
            }
        
        }
        

        【讨论】:

        • “仅通过类对象获取价值”是什么意思?以及如何将值初始化为(同样无用的)空字符串?
        • 好的,谢谢,我弄错了,如何只使用一个对象来设置数据并在不同的活动中获取它?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-26
        • 2016-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多