我在Android应用中使用了一些单身人士。在GlobalApp
中的extends Application
(onCreate()
)课程中,他们的初始化如下:
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上!
我的理解是
我的onCreate()
课程的application
方法保证在我的应用启动时被调用
Singleton上的实例永远不会变为null,除非应用程序完全重新启动(在这种情况下应该由我的application
类重新创建)。
这里发生了什么?
PS:我知道Singletons有点不受欢迎,并且每个人都不推荐扩展application
课程,但这不是重点。
编辑:为了澄清,代码可以在99%的时间内正常运行。问题不是询问如何实现单例模式,而是询问我(或任何)应用程序的生命周期如何导致instance
单例变为null
时application
创建onCreate()
1}} O(log n)
。
答案 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修饰符(或者同步部分)的单例,然后在另一个线程中你看到了陈旧的值。