Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 包含上下文的AWS SDK引用-Android_Java_Android_Amazon Web Services - Fatal编程技术网

Java 包含上下文的AWS SDK引用-Android

Java 包含上下文的AWS SDK引用-Android,java,android,amazon-web-services,Java,Android,Amazon Web Services,我正在我的android应用程序中使用AWS android SDK,使用DynamoDB、Cognito等 目前,我正在使用一个包含许多片段的MainActivity类,其中许多片段是全屏的。我的MainActivity包含我制作的AWSHelper类,该类包含我与DynamoDB通信、使用Cognito登录等所需的所有引用。AWSHelper类还包含对拥有它的MainActivity的引用,用于更改片段和对话框以及任何需要上下文的内容。我以前一直保持对我的AWSHelper类的静态引用,但我

我正在我的android应用程序中使用AWS android SDK,使用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维护当前引用的最佳方法,但这并不吸引人,因为这些字段包含
上下文
引用,这是一种糟糕的做法。不过,最大的原因是,当前台有新活动且MainActivity上下文不再是应该使用的上下文时,使用CognitoUserPool或使用MainActivity上下文创建的其他重要引用似乎是一个灾难的处方

在我的
main活动
课程中,我有一个参考
AWSHelper AWSHelper
访问并执行几乎所有与AWS相关的函数。在需要访问AWS的所有片段中,在
onCreate()
中,我有

main=(MainActivity)getActivity;
awsHelper=main活动。awsHelper

下面是一个场景,我试图用DynamoDB中存储的数据打开一个用户配置文件,我通常会调用
awsHelper.openProfile(user)
方法
openProfile()
启动加载概要文件的异步任务,然后将片段更改为包含所有数据的ProfileFragment

请记住,我的AWSHelper类不是一个片段,其中的方法在应用程序中的任何地方都是必需的

有安卓AWS SDK经验的人能否详细说明他们是如何做到这一点的

一些示例应用程序,比如来自的应用程序,似乎使用了我以前使用的方法——使用静态引用。不过,这是一个小样本应用程序,只有1个活动,而且简单得多

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

提前谢谢你的帮助

AWSHelper类还有一个对拥有它的MainActivity的引用

这是您的错误:将助手绑定到单个活动,而您实际上只需要一个上下文和一个片段管理器

因此,我建议您创建一个应用程序类,将其添加到清单中,并将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()
,或使应用程序类保存静态引用

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

AWSHelper类还有一个对拥有它的MainActivity的引用

这是您的错误:将助手绑定到单个活动,而您实际上只需要一个上下文和一个片段管理器

因此,我建议您创建一个应用程序类,将其添加到清单中,并将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()
,或使应用程序类保存静态引用


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

上下文引用并不是一个坏做法。活动引用是。您可以使用应用程序类,或者其他单例
ContextWrapper
type objectContext引用都是不错的做法。活动引用是。您可以使用应用程序类,或其他单例
ContextWrapper
type对象