【问题标题】:NullPointerException while setActivity设置活动时出现 NullPointerException
【发布时间】:2019-11-15 15:25:29
【问题描述】:

尝试打开 Activity 时,我的应用在某些设备上崩溃。问题并不总是发生,仅在某些设备上发生。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.pickerManager = GlobalHolder.getInstance().getPickerManager();
    this.pickerManager.setActivity(TempActivity.this); // <== line with error
    this.pickerManager.pickPhotoWithPermission();
}

堆栈跟踪:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.chillihaze.deskeep/com.libraries.imagepicker.TempActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.libraries.imagepicker.e.a(android.app.Activity)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3122)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3261)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1977)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6923)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:870)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.libraries.imagepicker.e.a(android.app.Activity)' on a null object reference
at com.libraries.imagepicker.TempActivity.onCreate(SourceFile:3)
at android.app.Activity.performCreate(Activity.java:7148)
at android.app.Activity.performCreate(Activity.java:7139)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1293)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3102)

我无法在我的设备上重现该错误,因此无法对其进行测试。

【问题讨论】:

    标签: java android nullpointerexception


    【解决方案1】:

    我无法在我的设备上重现该错误,因此无法对其进行测试。

    啊,您可以所有 Android 设备上重现该错误,您只需要知道如何; )

    发生内存不足的情况后,首先只重新创建当前 Activity,在返回导航时重新创建先前的Activity,并且所有静态变量都被清空(因为该进程在技术上被重新启动)。

    重现方式:

    • 在您的应用中转到TempActivity

    • 使用 HOME 按钮将您的应用程序置于后台

    • 点击 Android Studio 中的 TERMINATE 按钮

    • 从启动器重新启动应用程序

    您会体验到这种现象。

    (在 AS 4.0 Canary 中,这不起作用,您需要使用终端命令 adb shell am kill your.package.name 而不是使用 terminate 按钮)


    解决方案是使用statics 了解和谨慎 MAIN 活动(您使用&lt;intent-filter&gt;MAIN 操作定义的活动) ) 不能保证在 Android 应用程序执行期间完全运行,因此您应该相应地初始化内容。

    您可以轻松返回 DETAIL 屏幕作为您应用中的 First Starting Activity,并且 LIST 屏幕将仅在返回导航时创建。

    您还可以查看intent.putExtra(getIntent() 方法,它们会在Android 系统的进程死亡/内存不足的情况下保持。

    【讨论】:

    • +1 提示重现错误。使用静态时,我在 AS 上收到“不要将 Android 上下文类放在静态字段中(对具有指向 Activity 的字段活动的 PickerManager 的静态引用);这是内存泄漏”消息警报。
    • 嗯,是的,lint 警告是正确的,因为这就是你正在做/一直在做的事情。
    【解决方案2】:

    确保this.pickerManager 不为空,在下一行

    this.pickerManager.setActivity(TempActivity.this)
    

    【讨论】:

      猜你喜欢
      • 2012-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多