【问题标题】:AWS SDK References containing context - Android包含上下文的 AWS 开发工具包参考 - Android
【发布时间】:2017-08-28 06:42:50
【问题描述】:

我在我的 android 应用程序中使用适用于 android 的 AWS 开发工具包,使用 DynamoDB、Cognito 等。

目前我正在使用带有许多片段的单个 MainActivity 类,其中许多是全屏的。我的 MainActivity 包含我创建的 AWSHelper 类,其中包含我需要与 DynamoDB 通信、使用 Cognito 等登录的所有引用。AWSHelper 类还具有对拥有它的 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 引用,这是不好的做法。最大的原因是,拥有 CognitoUserPool 或使用 MainActivity 上下文创建的其他重要引用似乎是灾难的秘诀,当前台有新 Activity 并且 MainActivity 上下文不再是应该使用的时候使用。

在我的MainActivity 类中,我有一个参考AWSHelper awsHelper; 可以访问和执行我几乎所有与AWS 相关的功能。在我所有需要访问AWS的片段中,在onCreate(),我有

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

这是一个场景,我正在尝试使用存储在 DynamoDB 中的数据打开用户配置文件,我通常会调用 awsHelper.openProfile(user); 方法 openProfile() 启动一个加载配置文件的 AsyncTask,然后将片段更改为 ProfileFragment包含所有数据。

请记住,我的 AWSHelper 类不是一个片段,其中的方法在应用程序的几乎所有地方都是必需的。

有使用 AWS SDK for android 经验的人能否详细说明他们是如何做到的?

一些示例应用程序,例如来自https://github.com/awslabs/aws-sdk-android-samples/tree/master/AmazonCognitoYourUserPoolsDemo/app/src/main/java/com/amazonaws/youruserpools 的应用程序似乎使用了我之前使用的方法 - 使用静态引用。然而,这是一个包含 1 个活动的小型示例应用程序,而且要简单得多。

我唯一的另一个想法是将前面提到的所有 AWS 引用保留为静态引用,但每次切换活动时都使用对当前上下文的新引用重新创建 AWSHelper,但这仍然给我留下了旧 MainActivity 的问题上下文仍在 CognitoUserPool 等中被引用。

提前感谢所有帮助!

【问题讨论】:

  • 上下文引用是不错的做法。活动参考是。您可以使用 Application 类或其他单例 ContextWrapper 类型对象

标签: java android amazon-web-services


【解决方案1】:

AWSHelper 类还具有对拥有它的 MainActivity 的引用

这是你的错误:当你真的只需要一个 Context 和一个 FragmentManager 时,将该助手绑定到一个 Activity。

因此,我建议您创建一个 Application 类,将其添加到您的清单中,然后将您的 AWS 类重新定位到那里。

public class MyApplication extends Application {

    private AwsHelper aws;
    // etc

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

请注意,与活动一样,应用程序类也扩展了上下文,您可以使用getApplicationContext(),或者让您的应用程序类保存静态引用。

值得指出的是,您不应该在应用程序中以明文形式存储您的 APP_ID 和 SECRET_KEY,但这是一个单独的讨论

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-27
    • 2019-10-24
    • 1970-01-01
    • 2011-11-10
    • 2012-05-24
    • 2015-04-07
    • 2013-07-19
    • 1970-01-01
    相关资源
    最近更新 更多