在抽象类中获取应用程序上下文

时间:2012-06-12 13:23:24

标签: android class abstract android-context

我正在开发一个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)

1 个答案:

答案 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);
.
.
.


}