Singleton的实例null

时间:2015-06-15 06:19:30

标签: java android singleton

我在Android应用中使用了一些单身人士。在GlobalApp中的extends ApplicationonCreate())课程中,他们的初始化如下:

public class GlobalApp extends Application{


    @Override
    public void onCreate() {
        super.onCreate();

    DatabaseHelper databaseHelper = new DatabaseHelper(getApplicationContext()); 
    MySingleton.init(databaseHelper); 

    }
}

单身人士:

public class MySingleton{

   static MySingleton instance; 
   DatabaseHelper databaseHelper; 

   public static void init(DatabaseHelper databaseHelper){
      instance = new MySingleton(databaseHelper);
   }

}

我收到了我的应用程序的崩溃情况,当我的应用运行时,有时会清楚地显示该实例为null。最奇怪的是:那些崩溃只发生在三星Galaxy S5上!

我的理解是

  1. 我的onCreate()课程的application方法保证在我的应用启动时被调用

  2. Singleton上的实例永远不会变为null,除非应用程序完全重新启动(在这种情况下应该由我的application类重新创建)。

  3. 这里发生了什么?

    PS:我知道Singletons有点不受欢迎,并且每个人都不推荐扩展application课程,但这不是重点。

    编辑:为了澄清,代码可以在99%的时间内正常运行。问题不是询问如何实现单例模式,而是询问我(或任何)应用程序的生命周期如何导致instance单例变为nullapplication创建onCreate() 1}} O(log n)

7 个答案:

答案 0 :(得分:1)

我在我的应用程序中使用单例方法,就像我的方式一样,这对我来说很好用

        edtEventName.addTextChangedListener(new TextWatcher() {

                    @Override
                    public void onTextChanged(CharSequence s, int start, int before, int count) {
    //Save edit text value in single ton instance.  
                AddEventModel.getInstance().setEvent_name(edtEventName.getText().toString().trim());
                    }

                    @Override
                    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                    }

                    @Override
                    public void afterTextChanged(Editable s) {

                    }
                });

要在单身中设置值,我的行为如下,

     @Override
            public void onResume() {
                super.onResume();

        // Set same value saved in single ton before in onResume. 
        edtEventName.setText(AddEventModel.getInstance().getEvent_name());

        }

从单身人士获取价值,

mvn clean exec:java

尝试像这样使用单身,希望这会对你有帮助。

答案 1 :(得分:0)

使用以下代码来解决你的问题。

public class SingletonModel {
 private static SingletonModel instance;
 public DatabaseHelper databaseHelper; 


 public synchronized  static SingletonModel getSingletonModel() {

     if (instance == null) {
         instance = new SingletonModel();
     }
     return instance;

 }

 private void SingletonModel(){}

 }

答案 2 :(得分:0)

请检查应用程序中的清单文件你输了android:name =""像:

<application
        android:name=".application.DoodhwaalaApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

答案 3 :(得分:-1)

您应该有一个接受DatabaseHelper对象的构造函数,也将实例设为静态...

public class MySingleton {

    static MySingleton instance;

    DatabaseHelper databaseHelper;

    public/private MySingleton(DatabaseHelper databaseHelper) {
        // TODO Auto-generated constructor stub
    }

    public static void init(DatabaseHelper databaseHelper) {
        instance = new MySingleton(databaseHelper);
    }
}

答案 4 :(得分:-1)

单身人士应该拥有私人构造函数 因此,唯一的事实就是你可以做到这一点

 instance = new MySingleton(databaseHelper);

在与MySingleton不同的类别中使它与Singleton

不同

你应该通过像

这样的公共静态方法获得唯一的现有实例
 instance = MySingleton.getInstance(databaseHelper);

如果您需要它,在其实现中要小心验证没有可能返回null

答案 5 :(得分:-1)

创建Singleton类的另一种方法是将私有构造函数和类实例声明为static-final,这将在类加载时创建单例对象。但是确保在MySingleton类加载到JVM之前初始化了DatabaseHelper对象。

有关详细信息,请参阅下面的示例。

public class MySingleton {

    public static final MySingleton singleton = new MySingleton(DatabaseHelper databaseHelper);
    DatabaseHelper databaseHelper=  null;

    private MySingleton(DatabaseHelper databaseHelper) {
        this.databaseHelper = databaseHelper;
    }

    public MySingleton getInstance() {
        return singleton;
    }
}

答案 6 :(得分:-1)

你应该陷入多线程问题:在一个线程中你设置了不带volatile修饰符(或者同步部分)的单例,然后在另一个线程中你看到了陈旧的值。