2017-08-27 3 views
0

私はDynamoDBのを使用して、私のアンドロイドアプリでアンドロイド用AWS SDKを使用しています、CognitoなどAWS SDKのコンテキストを含む参照 - アンドロイド

現在、私はいっぱいあるその多くは、多くのフラグメント、と単一MainActivityクラスを使用しています画面。私のMainActivityには、AWSHelperクラスが含まれています。このクラスには、DynamoDBと通信するために必要なすべてのリファレンスが含まれています.Cognitoなどでサインインします。クラスには、フラグメントとダイアログの変更やコンテキストの必要な変更を行うためのMainActivity 。私は以前に私のAWSHelperクラスへの静的参照を保持していましたが、このAWSHelperクラスを使用するのが最良であるか唯一の方法ではないと感じています。

注:次のオブジェクトのほとんどは、MainActivityのコンテキストを参照して作成されています。ここで

私は知らないので、私は、他の活動を使用したい、または活動の中に私の現在の断片のいくつかを作るが、私はそうしなかったであろういくつかの参照

private DynamoDBMapper dynamoDBMapper; 
private AmazonDynamoDBClient ddbClient; 
private CognitoUserPool userPool; 
private CognitoUser cognitoUser; 

//Created with a reference to context 
userPool = new CognitoUserPool(mainActivity.getBaseContext(), POOL_ID, CLIENT_ID, CLIENT_SECRET, new ClientConfiguration()); 

の一例です私がDynamoDBとCognitoで現在持っているリファレンスを、再作成や静的リファレンスとして配置することなく維持する最良の方法ですが、これらのフィールドにはContextの参照が含まれているので魅力的ではありません。最も大きな理由は、MainActivityコンテキストで作成されたCognitoUserPoolやその他の重要な参照をフォアグラウンドに新しいアクティビティがある場合に使用する災害のレシピのようで、MainActivityコンテキストはもはや利用される。

私のクラスには、私のAWS関連の機能のすべてにアクセスして実行する参照AWSHelper awsHelper;があります。 AWSにアクセスするために必要なすべての私の断片では、onCreate()で、私はここで

main = (MainActivity) getActivity; awsHelper = mainActivity.awsHelper

シナリオで持って、私はDynamoDBの中に保存されたデータとユーザプロファイルを開くしようとしています、私は一般的にawsHelper.openProfile(user);呼ぶだろうメソッドopenProfile()は、プロファイルをロードするAsyncTaskを起動し、フラグメントをすべてのデータを含むProfileFragmentに変更します。

私のAWSHelperクラスはフラグメントではなく、その中のメソッドはアプリのどこでも必要です。

アンドロイド用のAWS SDKの経験がある人は、どのようにして作業を進めていますか?

https://github.com/awslabs/aws-sdk-android-samples/tree/master/AmazonCognitoYourUserPoolsDemo/app/src/main/java/com/amazonaws/youruserpoolsなどのサンプルアプリケーションの中には、スタティックリファレンスを使用して以前使用していた方法を使用しているようです。しかし、これは1つの活動とはるかに簡単な小さなサンプルアプリケーションです。

私の唯一のアイデアは、以前に言及したすべてのAWSリファレンスを静的リファレンスとして保持することですが、アクティビティを切り替えるたびにAWSHelperを新しいコンテキストで再作成します。 MainActivityコンテキストはCognitoUserPoolなどでまだ参照されています。

すべてのヘルプを事前にお寄せいただきありがとうございます。

+1

コンテキスト参照が悪い習慣はありません別の議論です。アクティビティ参照は以下のとおりです。あなたはApplicationクラス、あるいは他のシングルトン 'ContextWrapper'型オブジェクトを使うことができます –

答えて

2

AWSHelperクラスはまたあなたの間違いがあります

、それを所有するMainActivityへの参照があります:あなたは本当に唯一のコンテキストとFragmentManagerを必要とするとき、1つの活動にそのヘルパーを結合します。

したがって、アプリケーションクラスを作成してマニフェストに追加し、そこでAWSクラスを再配置することをお勧めします。活動のように、アプリケーションクラスは、コンテキストを拡張し、あなたがgetApplicationContext()を使用することができ、またはあなたのApplicationクラスを作り、

public class MyApplication extends Application { 

    private AwsHelper aws; 
    // etc 

    public void onCreate(...) { 
     userPool = new CognitoUserPool(this, POOL_ID, CLIENT_ID, CLIENT_SECRET, new ClientConfiguration()); 
    } 

注静的な参照を保持します。

指摘する価値、あなたはあなたのアプリケーション内で平文であなたのAPP_IDとSECRET_KEYを保存するべきではありませんが、それは

関連する問題