【问题标题】:When Calling Other Activity Method Showing NullPointerException调用其他活动方法时显示 NullPointerException
【发布时间】:2019-01-04 14:01:35
【问题描述】:

我有两个活动(PrivateContactActivity.javaAddContact.java)。 PrivateContactActivity里面有个方法:-

PrivateContactActivity.java

public void databaseLoader() {
    privateList.clear();
    myDatabase = new MyDatabase(PrivateContactActivity.this);
    Cursor cursor = myDatabase.queryData();
    StringBuilder stringBuilder = new StringBuilder();
    if (cursor.getCount() == 0) {
        Toast.makeText(this, "No Contact Found", Toast.LENGTH_SHORT).show();
    } else {
        while (cursor.moveToNext()) {
            String name, phone, email, address;
            name = cursor.getString(1);
            phone = cursor.getString(2);
            email = cursor.getString(3);
            address = cursor.getString(4);

            PrivateContactModel privateContactModel = new PrivateContactModel(name, phone, email, address);
            privateList.add(privateContactModel);
        }
    }
}

AddContact.java

@Override
public void onBackPressed() {
    PrivateContactActivity privateContactActivity = new PrivateContactActivity();
    privateContactActivity.databaseLoader();
    super.onBackPressed();
}

当我从AddContact 活动中调用此方法时,会显示NullPointerException。为什么会出现这个问题?我经常遇到这种问题。我以另一种方式从某种问题中解决了这个问题,但不知道为什么会出现这个问题。请解释一下。

【问题讨论】:

  • 在您的AddContact 活动中,我想您在数据库中添加了一个联系人。您不需要创建PrivateContactActivity 的新实例。只需在 PrivateContactActivity onCreate() 中调用 databaseLoader() 方法即可
  • AddContact 是一个活动类吗?为什么它会覆盖 onBackPressed

标签: android android-activity android-context


【解决方案1】:

绝对不能使用关键字 new 实例化 Activity。只有 Android 可以实例化 Android 组件(ActivityServiceBroadcastReceiverProvider)。当您使用 new 实例化 Android 组件时,Context 未正确设置,这就是您获得 NullPointerException 的原因。

要解决这个问题,您可以将您的方法 databaseLoader() 声明为 static 并将 Context 参数传递给它,可以根据需要使用它。从任何Activity 调用此方法时,您可以将this 作为Context 参数传递。


另外,不清楚为什么需要在onBackPressed() 中加载数据库,因为onBackPressed() 无论如何都只是完成了Activity,它将被销毁。这看起来很奇怪。

【讨论】:

  • 谢谢,现在我很清楚新关键字了。我在 onBackpressed() 中使用了 databaseLoader(),因为在添加新联系人后,我需要更新我的联系人列表(当我离开 AddContact 活动时)。现在你能告诉我一些小疑问吗?如果我们不能使用 NEW 关键字进行实例化,那么我们如何在不使用 static 关键字的情况下使用其他活动方法或变量?
  • Activity 中,您可以使用Activity 类的所有非静态变量和方法,因为它们的活动Context 已正确设置。如果您想从Activity 之外的Activity 中调用方法,那么您必须声明它static,并且必须传入对@ 的引用987654346@ (如果Activity 要求这样做。通常,如果您在Activity 类中有一个方法被其他类使用,那么该方法可能不属于Activity 类开头. 它应该被移动到一个单独的实用程序类(可能是static)。
  • 在您的情况下,您遇到问题的原因是您的架构错误。重新加载属于PrivateContactActivity 的联系人列表不是AddContact 的工作。这是PrivateContactActivity 在控制权返回时应该自己做的事情。您应该使用startActivityForResult()PrivateContactActivity 启动AddContact,然后刷新PrivateContactActivity.onActivityResult() 中的联系人列表。那么您不需要创建方法static 或从Activity 外部调用它,并且您不需要覆盖onBackPressed()
猜你喜欢
  • 2018-09-09
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 2023-01-09
  • 2011-02-17
  • 2018-08-26
  • 2017-06-25
  • 1970-01-01
相关资源
最近更新 更多