我的项目中有这个课程:
public class MyClass extends Application {
// some stuff
private Context context;
public MyClass() {
processContext();
APP_DIRECTORY = context.getFilesDir();
PRIVATE_FILE = new File(APP_DIRECTORY, MD5(getIEMI()));
}
public void processContext() {
do {
this.context = this.getApplicationContext();
} while (this.context==null);
}
// some other stuff, such as reading or writing above declared files
public String getIEMI() {
String IMEI;
Boolean hasTelephony = context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY);
if(hasTelephony) {
TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
IMEI = telephonyManager.getDeviceId();
} else {
IMEI = "IMEI_not_AVAIABLE";
}
return IMEI;
}
}
但是我在调用context
的任何地方都得到了NullPointerException(LogCat),即使我试图遵循提议的here提示(模拟器中的错误)。
我不能使用context = MyClass.this
,因为我总是(并且只)获得NullPointerException。
04-14 20:25:28.063:E / AndroidRuntime(1084):引起: java.lang.NullPointerException 04-14 20:25:28.063: E / AndroidRuntime(1084):at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:100) 04-14 20:25:28.063:E / AndroidRuntime(1084):at com.example.mypackage.MyClass.processContext(MyClass.java:71)//这是APP_DIRECTORY = context.getFilesDir();
的行
事实上,我不确定在Android中完全理解Context的定义。我非常有信心将课程扩展到超级Application
课程就足够了。
我不能用参数作为上下文来构造类,从调用者到达(以这种方式:(new MyClass(MainActivity.this))
)因为我需要读取和写入文件,即使是来自不是Activity
类的扩展名。
我生气了,说实话......
- 编辑 -
出于测试目的,我重新编写了类,以便以这种方式构建它:
public MyClass(Context app_context) {
APP_CONTEXT = app_context;
APP_DIRECTORY = APP_CONTEXT.getFilesDir();
}
调用getFilesDir()时,它总是返回NullPointerException。
- 编辑2 -
正如评论中所建议的,我添加了onCreate()的声明:
@Override
public void onCreate() {
super.onCreate();
Context context = this.getApplicationContext();
APP_DIRECTORY = getFilesDir();
LOGIN_FILE = new File(APP_DIRECTORY, name);
Log.e("MyApp", "Main point reached.");
}
这样一切看起来都不错。但是在onCreate()方法中声明的文件似乎总是为null,就好像它们根本没有被声明一样:当我尝试访问它们时,为了读取或写入,我得到了一个空指针异常。事实上“达到了主要目标”。永远不会显示,就好像永远不会调用onCreate(),也不会处理它。
答案 0 :(得分:3)
应用程序是上下文。尽量不要使用构造函数,而是使用onCreate。
您可以在没有getFilesDir
的情况下直接致电private Context context;
。
答案 1 :(得分:0)
将this.context
替换为getActivity()