2

私はAndroidアプリケーションを開発しています。私の質問は、抽象クラスでアプリケーションコンテキストを取得できますか?コンテキスト変数のnullポインター例外が発生します。これは、抽象クラス内で使用していることが原因である可能性があります。

注:私のコードには、他のクラス(Activites)をインスタンス化するために使用する抽象クラス(抽象クラ​​ス自体がActivityを拡張する)があります。抽象クラスでは、アクティビティヘルパーのインスタンスを作成します。これは、アプリの一般的なアクティビティ関連の機能を処理するクラスです。これは私のアクティビティヘルパークラスです:

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);
    }

しかし、それは私にnullポインタ例外を与えます。だから、抽象クラスのせいかと思いました。そしてこれはログです:

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)
4

1 に答える 1

1

abstactクラスを持つことは重要ではありません。

コンテキストがnullであるため、nullポインターがあります。これは、メソッドのどこかにエラーがあることを意味します。レビューするコードがないと、これ以上は役に立ちません。

編集:

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

これで十分です。これが役に立ったかどうか教えてください。単にアクティビティがコンテキストから拡張されるので、次のこともできます。UIUtils.isTablet(activity);

もう1つの主題は、コードから判断できないインスタンスを実際に作成する方法です。アクティビティはインテントで開始され、ライフサイクルがあり、コンストラクターで構築することはできません。

編集2:

あなたの問題はこのコードにあります:

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

現時点では、アクティビティはまだ作成されていないため、コンテキスト( "this")はnullです。

onCreateでアクティビティヘルパーの初期化を移動する必要があります。アクティビティの動作は他のクラスとは少し異なります。アクティビティのライフサイクルについてもう少し読んで、さらにいくつかの例を参照することをお勧めします(google:)を試してください)。

正しいケースは次のとおりです。

private ActivityHelper mActivityHelper;

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

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


}
于 2012-06-12T13:47:53.213 に答える