我正在开发一个Android应用程序。我的问题是我可以在抽象类中获取应用程序上下文吗?它给了我上下文变量的空指针异常,我想它可能是因为我在抽象类中使用它。
注意:在我的代码中,我有一个抽象类(抽象类本身扩展了Activity),我用它来实例化其他类 - Activites。在抽象类中,我创建了一个活动助手的实例,这个类处理应用程序中与活动相关的一些常见功能。这是我的活动助手类:
public class ActivityHelper {
protected Activity mActivity;
public static ActivityHelper createInstance(Activity activity, Context context) {
return UIUtils.isTablet(context) ?
new ActivityHelperTablet(activity) :
new ActivityHelper(activity);
}
protected ActivityHelper(Activity activity) {
mActivity = activity;
}
}
函数isTablet接收我在抽象类
中创建的上下文变量 public static boolean isTablet(Context context) {
// Can use static final constants like HONEYCOMB, declared in later versions
// of the OS since they are inlined at compile time.
return isHoneycomb() ||
((context.getResources().getConfiguration().screenLayout &
Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE);
}
BaseActivity的重要部分:
public abstract class BaseActivity extends Activity {
Context context = this.getApplicationContext();
final ActivityHelper mActivityHelper = ActivityHelper.createInstance(this, context);
}
但它给了我一个空指针异常。所以我认为这可能是因为抽象类。 这是日志:
06-12 15:59:56.011: E/AndroidRuntime(1206): Caused by: java.lang.NullPointerException
06-12 15:59:56.011: E/AndroidRuntime(1206): at
android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:101)
06-12 15:59:56.011: E/AndroidRuntime(1206): at
com.navayo.sec.voip.activities.BaseActivity.<init>(BaseActivity.java:35)
06-12 15:59:56.011: E/AndroidRuntime(1206): at
com.navayo.sec.voip.activities.MainActivity.<init>(MainActivity.java:43)
06-12 15:59:56.011: E/AndroidRuntime(1206): at
java.lang.Class.newInstanceImpl(Native Method)
06-12 15:59:56.011: E/AndroidRuntime(1206): at
java.lang.Class.newInstance(Class.java:1319)
06-12 15:59:56.011: E/AndroidRuntime(1206): at
android.app.Instrumentation.newActivity(Instrumentation.java:1023)
06-12 15:59:56.011: E/AndroidRuntime(1206): at
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1870)
答案 0 :(得分:1)
拥有一个抽象类并不重要。
你有一个空指针,因为你的上下文是null,这意味着你的方法中的某个地方有一个错误,没有要审查的代码,我无法帮助你。
编辑:
public static ActivityHelper createInstance(Activity activity) {
return UIUtils.isTablet(activity.getApplicationContext());
}
这应该足够了。告诉我这是否有帮助。只是一个活动从上下文扩展,所以你甚至可以这样做:UIUtils.isTablet(activity);
现在另一个主题是您实际创建实例的方式,这些实例无法从代码中分辨出来,活动以意图开始并具有生命周期,它们不能用构造函数构建。
编辑2:
您的问题出在以下代码中:
final ActivityHelper mActivityHelper = ActivityHelper.createInstance(this, context);
此时尚未创建活动,因此您的上下文(“this”)为空。
您需要在onCreate中移动活动助手初始化。该活动与其他课程的工作方式略有不同,在活动生命周期中阅读更多内容并查看更多示例(尝试谷歌:))可能是一个好主意。
正确的情况是:
private ActivityHelper mActivityHelper;
protected void onCreate(Bundle savedInstanceState){
super(savedInstanceState);
// here do the initialization
mActivityHelper = ActivityHelper.createInstance(this);
.
.
.
}