gpt4 book ai didi

android - 静态单例未在 Activity 中初始化。有什么问题吗?

转载 作者:行者123 更新时间:2023-11-29 18:10:38 24 4
gpt4 key购买 nike

我正在尝试追踪出现在我的 ACRA 日志中但我无法重现的新空指针异常。相关代码如下:

public class MyApplication extends Application {
public void onCreate() {
DataManager.instance().initializeData(this);
}
}

public class DataManager {
private static DataManger instance = new DataManger();
private List<DataModel> dataModels;
private List<I_Callback> callbacks = new ArrayList<I_Callback>();
private boolean isInitialized = false;

private DataManager(){}

public static DataManager instance() {
return instance;
}

public void initializeData(Context context) {
new DataManagerInitializer().execute(context);
}

public void setDataModels(List<DataModel> models) {
dataModels = models;
}

public void synchronized registerInitializeCallbacks(I_Callback callback) {
if (isInitialized) {
callback.executeCallback();
} else {
callbacks.add(callback);
}
}

public void synchronized setInitialized() {
isInitialized = true;
for (I_Callback callback:callbacks) {
callback.executeCallback();
}
callbacks.clear();
}
}

public class DataManagerInitializer extends AsyncTask<Context, Void, Void>{
protected Void doInBackground(Context... contexts){
List<DataModel> dataModels = new ArrayList<DataModel>();
/*various code to create DataModel objects and add to dataModels list*/
DataManager.instance().setDataModels(dataModels);
return null;
}

protected void onPostExecute(Void result) {
DataManager.instance().setInitialized();
}
}

public class ActivityA extends Activity implements I_Callback{
public void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.graphical_layout);
DataManager.instance().registerInitializeCallbacks(this);
}

public void executeCallback() {
/* wire up button to call Activity B */
}
}

public class ActivityB extends Activity {
public void onCreate(Bundle savedInstanceState) {
List<DataModel> dataModels = DataManager.instance().getDataModels();

/* The following line of code throws a null pointer exception
in the stack trace*/
for (int i=0; i < dataModels.size(); i++){
/* do something with the data model */
}
}
}

为了更简单地分解上面的内容,启动了应用程序,它开始了数据管理器单例的初始化。 ActivityA,主要 Activity ,启动并等待数据管理器完成初始化,然后再允许任何操作,连接任何事件等。从 ActivityA,如果不执行回调方法就不可能到达 ActivityB,ActivityB 只能从 Activity A。 DataManager 中数据模型列表为 null 的唯一方法是它没有被初始化,但我正在努力看看这是怎么可能的。关于我的空指针可能如何发生的任何建议?

最佳答案

private static DataManger instance = new DataManger();

...


public static DataManager instance() {
return instance;
}

就是问题所在。所以你的 instance 变量正在被垃圾收集。因为它在声明时被实例化,所以它没有被适本地重新实例化。所以,试试这个:

private static DataManger instance = null;

...


public static DataManager instance() {
if (instance == null){
instance = new DataManager();
}
return instance;
}

这将确保对 instance() 的调用(通常称为 getInstance() 但这只是惯例)将返回数据管理器的有效单个实例。尽量避免在声明时实例化全局变量,以避免这个特定问题。

关于android - 静态单例未在 Activity 中初始化。有什么问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10940994/

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