为什么以下方法会抛出NPE,
public ActivityOne extends Activity{
DataManager dtMan = new DataManager(this)
public onCreate (){
...some source code here...
dtMan.check();
}
}
public class DataManager(){
private Context myContext;
public DataManager (Context context){
myContext = context;
}
Helper helper = new Helper(this);
public boolean check(){
helper.open();
...some source code here...
}
}
当我查看logcat时;我得到一个java.null.pointer异常,所以我做了类似
的事情public class DataManager(){
private Context myContext;
public DataManager (Context context){
myContext = context;
}
public boolean check(Context context){
**Helper helper = new Helper(context);**
helper.open();
...some source code here...
}
}
并且它有效,所以在Java / Android编程透视图中两个DataManager之间有什么区别,因此如果我理解正确,这种方法必须复制到如下:
public class DataManager(){
private Context myContext;
public DataManager (Context context){
myContext = context;
}
public boolean check(Context context){
**Helper helper = new Helper(context);**
helper.open();
...some source code here...
}
public boolean check2(Context context){
**Helper helper = new Helper(context);**
helper.open();
...some source code here...
}
public boolean check3(Context context){
**Helper helper = new Helper(context);**
helper.open();
...some source code here...
}
}
意思是我不能一次声明Helper Class并在调用类的任何地方使用它,我是否忘记了一些基本原理?请澄清。
上下文是否也会导致内存泄漏?如果是这样,我将如何解决?
@EDIT:
好吧,我忘了包括助手班
public class Helper { private Context myContext;
public Helper(Context context){
myContext = context;
}
public void open(){
//do stuff here
}
}
答案 0 :(得分:1)
您的代码不起作用,因为DataManager在Activity中的字段范围初始化。
需要Context的类应该始终在Activity的一个生命周期方法中初始化:
onCreate,onStart,onDestroy等
像这样:
private DataManager dataManager;
public void on create(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
dataManager = new DataManager(this):
}
您还应该在DataManager构造函数中初始化Helper类:
public class DataManager(){
private Context context;
private Helper helper;
public DataManager (Context context){
this.context = context;
this.helper = new Helper(this.context);
}
public boolean check(Context context){
helper.open();
//...some source code here...
}
}
为防止内存泄漏,您只需确保DataManager类不是具有活动上下文的静态实例。
如果您不需要活动上下文,但您也应该使用应用程序上下文,那么您应该使用它:
public DataManager(Context context){
this.context = context.getApplicationContext();
//...
}
答案 1 :(得分:0)
试试
dtMan = new DataManager(this)
在Activity中的onCreate方法中?