2017-08-05 8 views
0

私はユーティリティクラスを構築したいと思います。典型的なUIや対話機能を提供するデータベースから値を読み取る必要があります。アプリケーションのタイトルの設定、背景画像の設定、背景音楽の再生などがあります。UIのユーティリティクラスを構築する最善の方法

他の質問のためにHow to use UI functions in non UI methods?私はそれを行うためのさまざまな方法があることを認識しました。私は、あらゆる方法で、すべての方法でtitelを設定するためのさまざまな方法をテストしました。しかし、これは最もクリーンで正しい/自信を持って、なぜですか?

例では、呼び出し元クラスはkotlinクラスですが、これは無関係です。

ウェイワン!アクティビティに関連するすべてのアクティビティがコールアクティビティで実行されます。コンテキストはコンストラクタを経由して渡され、代わりにすべての関数呼び出しで呼び出すことができます。 私の意見では、ここではあまり依存していないが、ユーティリティユーザーは自分自身で多くのことをしなければならない。

呼び出し元のクラス:クラスと呼ばれる

frameworkFeatures(applicationContext); 
setTitle(frameworkFeatures.frameworkSetTitlesStaticContext()); 

private static Context frameworkContext; 

    public frameworkFeatures(Context context) { 

     frameworkContext = context; 

    } 

    public static String frameworkSetTitlesStaticContext(){ 

     TestMainDatabase.getDatabase(frameworkContext); 
     TestMainDatabase db = RoomAsset.databaseBuilder(frameworkContext, TestMainDatabase.class, "TestMainDatabase.db").allowMainThreadQueries().build(); 
     return db.featuresDao().findByName("title").getFeatureValue().toString(); 

    } 

ウェイ2。可能な限り隠れる。すべてをユーティリティクラスに渡す必要があります。より多くのアクティビティで使用されている場合、これを処理する方法。 utilitieクラスの静的なActivity宣言ではまだ可能でしょうか?

呼び出し元のクラス:クラスと呼ばれる

frameworkFeatures(applicationContext,this) 
    frameworkFeatures.frameworkSetTitleEverythingisStatic() 

private static Context frameworkContext; 
private static Activity frameworkActivity; 
private static TestMainDatabase frameworkTestMainDatabase; 

public frameworkFeatures(Context context, Activity activity){ 

    frameworkContext = context; 
    frameworkActivity = activity; 

    TestMainDatabase.getDatabase(context); 
    frameworkTestMainDatabase = RoomAsset.databaseBuilder(frameworkContext,TestMainDatabase.class, "TestMainDatabase.db").allowMainThreadQueries().build(); 


} 

public static void frameworkSetTitleEverythingisStatic(){ 

    frameworkActivity.setTitle(frameworkTestMainDatabase.featuresDao().findByName("title").getFeatureValue().toString()); 

} 

答えて

0

あなたは有効なコンテキスト/活性を有することが必要な場合は、代わりにApplicationonCreate()に呼び出されなければなりませんAPIを初期化し提供することができます。以下のような何か:

public static void initialize(Application context) { 
    appContext.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() { 
     ... 
     @Override 
     public void onActivityResumed(Activity activity) { 
      sGlobalContext = activity; 
     } 
     @Override 
     public void onActivityPaused(Activity activity) { 
      sGlobalContext = null; 
     } 
     .... 
    ... 
} 

そして、あなたのフレームワークはもう活動/状況を心配しないでください。あなたが現在可視/アクティブな活動を追跡するだろうあなた自身のApplication.ActivityLifecycleCallbacksを登録することができたのインサイド

Framework.initialize(appContext); 

。 Userの場合、すべて透過的です。

+0

万一sGlobalContextは、このクラスの静的コンテキスト変数です。一度に1つのアクティビティだけがアクティブになる可能性があるので、もう気にする必要はありません。クラスを「クリーンアップ」しても何の問題もなく、他のアクティビティが呼び出されますか? – freeLearning

+0

ユーティリティが非アクティビティクラスから呼び出されたとき。私はそれらを初期化せずに呼び出すことができますか? – freeLearning

+0

右 - ライフサイクルリスナーを登録するためにフレームワークを1回だけ初期化する必要があります。そしてコンテキストを渡す必要なしにあなたの 'API'を直接使用してください。 'frameworkSetTitle'と同様です。 'frameworkSetTitle'は、コンテキストがプライベート静的変数'に格納されるに 'Framework'のファサードに定義されたパッケージプライベート静的getterメソッドからそれを取るでしょうsGlobalContext' – j2ko

関連する問題