调用onBackPressed()时崩溃

时间:2019-07-16 16:10:31

标签: android nullpointerexception

我正在发送API请求以发送电子邮件,并在成功响应后在我的 EmailActivity 类中调用 onBackPressed()

我还有 AbstractBaseActivity 类,该类由我的 EmailActivity 类扩展。

我经常发生此崩溃。

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Handler android.app.FragmentHostCallback.getHandler()' on a null object reference
       at android.app.FragmentManagerImpl.ensureExecReady + 2003(FragmentManager.java:2003)
       at android.app.FragmentManagerImpl.execPendingActions + 2056(FragmentManager.java:2056)
       at android.app.FragmentManagerImpl.popBackStackImmediate + 870(FragmentManager.java:870)
       at android.app.FragmentManagerImpl.popBackStackImmediate + 831(FragmentManager.java:831)
       at android.app.Activity.onBackPressed + 3111(Activity.java:3111)
       at android.support.v4.app.FragmentActivity.onBackPressed + 187(FragmentActivity.java:187)
       at com.anstar.fieldworkhq.core.AbstractBaseActivity.onBackPressed + 71(AbstractBaseActivity.java:71)
       at com.anstar.fieldworkhq.emails.EmailActivity.displayEmailSent + 283(EmailActivity.java:283)
       at com.anstar.presentation.emails.EmailPresenter.lambda$sendEmail$2$EmailPresenter + 100(EmailPresenter.java:100)
       at com.anstar.presentation.emails.EmailPresenter$$Lambda$2.accept + 4(:4)
       at io.reactivex.internal.observers.ConsumerSingleObserver.onSuccess + 62(ConsumerSingleObserver.java:62)
       at io.reactivex.internal.operators.single.SingleObserveOn$ObserveOnSingleObserver.run + 81(SingleObserveOn.java:81)
       at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run + 124(HandlerScheduler.java:124)
       at android.os.Handler.handleCallback + 873(Handler.java:873)
       at android.os.Handler.dispatchMessage + 99(Handler.java:99)
       at android.os.Looper.loop + 193(Looper.java:193)
       at android.app.ActivityThread.main + 6718(ActivityThread.java:6718)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run + 493(RuntimeInit.java:493)
       at com.android.internal.os.ZygoteInit.main + 858(ZygoteInit.java:858)

这是我的EmailActivity中的代码。

  @Override public void displayEmailSent() {
    Toast.makeText(this, R.string.email_sent, Toast.LENGTH_SHORT).show();
    onBackPressed();
  }

这是我在AbstractBaseActivity中的代码。

  @Override public void onBackPressed() {
    if(this instanceof AddTaskActivity ||
        this instanceof AddCustomerActivity ||
        this instanceof AddContactsActivity ||
        this instanceof NoteDetailsActivity ||
        this instanceof AddEstimateActivity ||
        this instanceof AddAgreementsActivity ||
        this instanceof AddAppointmentActivity ||
        this instanceof EditServiceLocationActivity) {
      showExitDialogForFormScreens();
    } else {
      super.onBackPressed();
    }
  }

这是EmailPresenter的代码。

 public void sendEmail(int entityId, EmailType emailType, String emailBody, String subject, List<String> recipients) {
    disposables = RxUtil.initDisposables(disposables);

    if(TextUtils.isEmpty(subject)) {
      view.displaySubjectInvalid();
      return;
    }

    if(TextUtils.isEmpty(emailBody)) {
      view.displayEmailBodyInvalid();
      return;
    }

    if(recipients == null || recipients.isEmpty()) {
      view.displayRecipientsEmpty();
      return;
    }

    if(!Utils.isValidEmailAddress(recipients.get(0))) {
      view.displayEmailToInvalid();
      return;
    }

    String modelType = getModelType(emailType);

    view.disableEmailButton();

    Disposable disposable = emailsRepository.sendEmail(entityId, modelType, emailBody, subject, recipients)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(response -> {
          view.enableEmailButton();
          if (response.isSuccessful()) {
            view.displayEmailSent();
          } else {
            view.displayEmailError();
          }
        }, throwable -> {
          view.enableEmailButton();
          view.handleError(throwable);});

    disposables.add(disposable);
  }

我从EmailActivity返回另一个活动,但是如果我返回两个或三个屏幕,它将返回到Fragment

我该如何解决?

3 个答案:

答案 0 :(得分:2)

如果您只是想杀死当前活动并返回上一个活动,则可以呼叫finish()而不是onBackPressed()

答案 1 :(得分:2)

根据此日志,我认为您的rxJava仍处于活动状态

  

io.reactivex.internal.observers.ConsumerSingleObserver.onSuccess +   62(ConsumerSingleObserver.java:62)          在io.reactivex.internal.operators.single.SingleObserveOn $ ObserveOnSingleObserver.run   + 81(SingleObserveOn.java:81)          在io.reactivex.android.schedulers.HandlerScheduler $ ScheduledRunnable.run   + 124(HandlerScheduler.java:124)          在android.os.Handler.handleCallback + 873(Handler.java:873)          在android.os.Handler.dispatchMessage + 99(Handler.java:99)

尝试调用这样的内容

@Override
    protected void onDestroy() {
        super.onDestroy();

        if(disposable != null && !disposable.isDisposed()) {
            disposable.dispose();
        }
    }

答案 2 :(得分:-1)

我建议使用方法onBackPressed()来清理finish()return()

相关问题