gpt4 book ai didi

java - 单例 null 的实例

转载 作者:行者123 更新时间:2023-12-01 06:25:19 25 4
gpt4 key购买 nike

我在 Android 应用程序中使用了一些单例。从我的 onCreate() 中的 GlobalApp (extends Application) 类,它们的初始化如下:

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. 我的 application 类的 onCreate() 方法保证在我的应用程序启动时被调用

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

这是怎么回事?

PS:我知道单例有点令人不悦,并且扩展 application 类也不是每个人都推荐的,但这不是重点。

编辑:为了澄清起见,该代码在 99% 的情况下都可以工作。问题不是问如何实现单例模式,而是问我的(或任何)应用程序的生命周期如何导致单例的实例在它变为null时在applicationonCreate()中创建。

最佳答案

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

        public class AddEventModel {

private String event_name;
private String event_image;
private static AddEventModel _instance;

//For Single Ton

public static AddEventModel get_instance() {
return _instance;
}

public static AddEventModel getInstance() {
if (_instance == null) {
_instance = new AddEventModel();
}
return _instance;
}
public static void set_instance(AddEventModel _instance) {
AddEventModel._instance = _instance;
}

//Getter setter for model.
public String getEvent_image() {
return event_image;
}

public void setEvent_image(String event_image) {
this.event_image = event_image;
}

public String getEvent_name() {
return event_name;
}

public void setEvent_name(String event_name) {
this.event_name = event_name;
}

要在单例中设置值,我正在执行如下操作,

        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) {

}
});

从单例中获取值(value),

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

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

}

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

关于java - 单例 null 的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30838465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com