2016-07-05 8 views
0

シングルトンクラスを実装して、すべてのメソッド/コンストラクタのパラメータとしてPassアクティビティを回避しました。"Token is null"コンテキスト/アクティビティのシングルトンを使用

public class ApplicationContext { 

    private static class Holder { 
     private static final ApplicationContext INSTANCE = new ApplicationContext(); 
    } 

    private ApplicationContext() {} 

    private Context mContext; 

    public static ApplicationContext getInstance(){ 
     return Holder.INSTANCE; 
    } 

    public Context getContext(){ 
     return Holder.INSTANCE.mContext; 
    } 


    public void setContext(Context mContext){ 
     Holder.INSTANCE.mContext = mContext; 
    } 
} 

そして、私の最初の活動で、私はコンテキストを設定します。

private void initializeObjects(){ 
    ApplicationContext.getInstance().setContext(getApplicationContext()); 
} 

私はProgressDialogにコンテキストを使用しようとすると問題が起こる:

@Override 
protected void onPreExecute() { 
    pd = ProgressDialog.show(context, "", "Salvando Usuário"); 
} 

エラーメッセージ:

07-05 20:29:46.413 30930-30930/com.test.app E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: com.test.app, PID: 30930 
android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 
     at android.view.ViewRootImpl.setView(ViewRootImpl.java:690) 
     at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:289) 
     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85) 
     at android.app.Dialog.show(Dialog.java:311) 
     at android.app.ProgressDialog.show(ProgressDialog.java:116) 

私は試したようなシングルトンを使用する良い練習ですか?どうしましたか?そうでない場合は、代わりにすべてのコールにコンテキスト/アクティビティを渡すのがよい方法ですか?

ありがとうございます。

+0

「コンテキスト」とは何ですか?ここに掲載されたものは、これがどこに割り当てられているかを示していませ –

答えて

1

AlertDialogの場合、アクティビティではないコンテキストを使用することはできませんので、フラグメントにある場合はActivity.thisやgetActivity()などを使用してください。

アプリケーションのグローバルコンテキストを使用して色や描画可能なものなどを取得することはできますが、このコンテキストでビューを作成するとそのテーマは無視されるため、できるだけアクティビティコンテキストを使用してみてください。

ただし、コンテキストにアクセスできるシングルトンを持つ場合は、ApplicationContextでApplicationクラスを拡張し、onContentメソッドをオーバーライドし、このApplicationContextクラスをマニフェストApplication要素名に追加する必要があります。そのinitializeObjectsメソッドを使用し、最初のアクティビティから呼び出す場合、そのアクティビティを終了するときにそのコンテキストに何が起こるのでしょうか?だから、例として

:アプリが実行されると

public class ApplicationContext extends Application { 

    private Context mContext; 

    public static Context getContext(){ 
     return mContext; 
    } 

    @Override 
    public void onCreate() { 
     mContext = this; 

     // you can initialize other stuff here if you want 
    } 

} 

// manifest 
<application 
     android:name="com.example.ApplicationContext" 

、それは常にApplicationクラスののonCreateメソッドを通過し、それがアプリのライフサイクル全体を通じて住んでいます。しかし、あまりにもそれを乱用しないでください。

+0

mContextへの参照を保存する必要はありません。アプリケーションオブジェクトはすでに内部的にコンテキストを持っています。これは絶対に冗長です。 – apelsoczi

+0

@apelsoczi何をお話しますか? Applicationクラスは、Contextを拡張するContextWrapperを拡張します。それをアプリケーションの名前またはコンテキストと呼ぶことは、あなたがどこかで自由に使用するためにコンテキストを取得していることは誰にも明らかですが、同じことです。 – mobilepotato7

+0

私はそこで行を誤読しています。 – apelsoczi