【问题标题】:Null Error attempting to create an intent in AsyncTask尝试在 AsyncTask 中创建意图的空错误
【发布时间】:2018-06-12 21:18:00
【问题描述】:

如果这是一个愚蠢的问题,我深表歉意,但在 AsynTask 从我的 AWS 数据库中拉出用户后,我正在尝试为 AsynTask 中的下一个活动创建一个 Intent。注意这个类是 HomeActivity,下一个是 GroupActivity。下面是运行 AsynTask 的按钮:

Button groupPageBtm = findViewById(R.id.groupPage);
        groupPageBtm.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                LoadGroupUser loadGroupUser = new LoadGroupUser(HomeActivity.this);
                loadGroupUser.execute(makeUserIDString.uniqueIDCreater(userProfile));
            }
        });

这是我的 AsynTask 子类:

class LoadGroupUser extends AsyncTask<String, Void, GroupDO>{


    private DynamoDBMapper dynamoDBMapper;
    Activity activity;

    public LoadGroupUser(Activity mActivity){
        this.activity = mActivity;
    }

    Intent groupLoadIntent = new Intent(activity, GroupActivity.class);

    @Override
    protected GroupDO doInBackground(String... groupPresidentGroups) {
        AmazonDynamoDBClient dynamoDBClient = new AmazonDynamoDBClient(AWSMobileClient.getInstance().getCredentialsProvider());
        this.dynamoDBMapper = DynamoDBMapper.builder()
                .dynamoDBClient(dynamoDBClient)
                .awsConfiguration(AWSMobileClient.getInstance().getConfiguration())
                .build();

        GroupDO groupPresDO = dynamoDBMapper.load(GroupDO.class, groupPresidentGroups[0]);
        Log.i("loadedPresident: ", groupPresDO.getGroupId().toString());
        return null;
    }

    @Override
    protected void onPostExecute(GroupDO groupDO) {
        super.onPostExecute(groupDO);

        groupLoadIntent.putExtra("groupPresident", groupDO.getGroupPresident().toString());
        activity.startActivity(groupLoadIntent);
        Log.i("groupPresident", groupDO.getGroupPresident().toString());

     }
}

错误信息:

-12 17:02:59.424 10503-10503/com.ronone.securesender E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.ronone.securesender, PID: 10503
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
        at android.content.ComponentName.<init>(ComponentName.java:130)
        at android.content.Intent.<init>(Intent.java:5780)
        at com.ronone.securesender.LoadGroupUser.<init>(HomeActivity.java:188)
        at com.ronone.securesender.HomeActivity$1.onClick(HomeActivity.java:77)
        at android.view.View.performClick(View.java:6294)
        at android.view.View$PerformClick.run(View.java:24770)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

【问题讨论】:

  • 顺便说一句,“m”命名约定是您的类成员获取“m”,而不是您的方法参数。所以你的构造函数中的赋值看起来像mActivity = activity
  • 顺便说一句,你能添加 AWSMobileClient.getInstance().initialize(this).execute();在尝试使用 AWSMobileClient 获取配置和凭证提供程序之前?

标签: java android amazon-web-services amazon-dynamodb


【解决方案1】:

问题出在这里:

public LoadGroupUser(Activity mActivity){
    this.activity = mActivity;
}

Intent groupLoadIntent = new Intent(activity, GroupActivity.class);

字段初始化程序在构造函数之前运行,因此activity 仍然为空。改为这样做:

Intent groupLoadIntent;

public LoadGroupUser(Activity mActivity){
    this.activity = mActivity;
    groupLoadIntent = new Intent(activity, GroupActivity.class);
}

但请注意,您可能会通过在 AsyncTask 中强烈引用您的活动来泄露您的活动。那完全是另一个话题。在此站点中搜索“AsyncTask 活动泄漏”。

【讨论】:

  • 成功了,谢谢!将调查 AsyncTask Activity Leak。
猜你喜欢
  • 2017-07-23
  • 1970-01-01
  • 2018-12-03
  • 2022-12-16
  • 1970-01-01
  • 1970-01-01
  • 2017-01-21
  • 2012-07-27
  • 1970-01-01
相关资源
最近更新 更多