2012-06-12 83 views
1

我正在開發一個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

這些東西都沒有關係。你的實現有問題。 – DeeV

回答

1

具有抽象類並不重要。

你有一個空指針,因爲你的上下文是空的,這意味着在你的方法的某個地方有一個錯誤,沒有代碼審查我不能幫你更多。

編輯:

public static ActivityHelper createInstance(Activity activity) { 
return UIUtils.isTablet(activity.getApplicationContext()); 
} 

這應該是足夠了。告訴我這是否有幫助。簡單的活動從上下文中延伸,你甚至可以這樣做:UIUtils.isTablet(activity);

現在另一個問題是,你實際上是在創建這是不可能的,從你的代碼告知的情況下,活動的開始與意圖的方式,有一個生命週期,他們不能用構造函數構造。

編輯2:

你的問題是這樣的代碼:

final ActivityHelper mActivityHelper = ActivityHelper.createInstance(this, context); 

此時活動尚未創建,所以你的情況下(「本」)爲空。

您需要在onCreate中移動活動幫助程序初始化。該活動與其他類有點不同,因此在活動生命週期中閱讀更多內容並查看更多示例(嘗試google :))可能是一個好主意。

正確的情況是:

private ActivityHelper mActivityHelper; 

protected void onCreate(Bundle savedInstanceState){ 
super(savedInstanceState); 
// here do the initialization 

mActivityHelper = ActivityHelper.createInstance(this); 
. 
. 
. 


} 
+0

好的,我會試試看。我知道也許我的問題沒有意義,但現在我被困了幾個小時,所以我不得不問。 – Sandra

+0

這是否與我的主要活動擴展了我的抽象類BaseActivity以及當我嘗試獲取應用程序上下文時有關,也許我的活動甚至沒有創建。但問題是我必須首先檢查設備是平板電腦還是手機。 (我在我的基類中做過的) – Sandra

+0

正如我在我的帖子中所說的那樣,並在其他人的回答中提到:這並不重要。這與您所面臨的問題無關。你的活動是怎樣的?你可以發佈該代碼,包括UI Utils函數和基本活動嗎? – DArkO

相關問題