【问题标题】:How can I use Progress dialog with RxJava api call in android如何在 android 中使用带有 RxJava api 调用的进度对话框
【发布时间】:2026-02-01 10:45:02
【问题描述】:

我正在使用 RxJava 和 retorifit 进行 api 调用。但是,当我在方法成功后关闭进度对话框时,应用程序崩溃/停止。如何正确处理这种情况。

以不影响 UI 的方式处理此 api 调用的最佳方法是什么。

这是我的代码:

disposable.add(
    apiInterface
        .getWorkOrders(TbmUtils.getUserToken(TbmApp.get().getContext()),TbmUtils.getUserId(TbmApp.get().getContext()))
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())

        .subscribeWith(new DisposableSingleObserver<HomeWorkOrderModel>() {
            @Override
            public void onSuccess(HomeWorkOrderModel workOrderModel) {
                progressdialog.dismiss(); //Here it crash

                Gson g=new Gson();
                Log.v(TAG," Response: "+g.toJson(workOrderModel) );
                if(workOrderModel!=null){

                    if(workOrderModel.getStatus()!=null){

                        if(workOrderModel.getStatus().equals(TbmConstants.STATUS_TRUE)){

                            if(workOrderModel.getResult()!=null){

                                venuetotal.set(workOrderModel.getResult().getTotalVenues());
                                workorders.set(workOrderModel.getResult().getTotalOrders());
                                name.set(TbmUtils.getUserName(TbmApp.get().getContext()));

                                if(workOrderModel.getResult().getOrders().size()!=0){
                                    homeWorkOrderAdapter.addListing(workOrderModel.getResult().getOrders());
                                }
                            }
                        }else {
                            ShowToast(workOrderModel.getMessage());
                        }
                    }
                }
            }

            @Override
            public void onError(Throwable e) {
               // HideProgress();
                showError(e);
            }
        }
    )
);

这是日志文件:

java.lang.IllegalStateException:调度程序抛出致命异常。 07-26 16:10:06.381 28577-28577/com.tbmsr W/System.err: 在 io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:111) 07-26 16:10:06.381 28577-28577/com.tbmsr W/System.err: 在 android.os.Handler.handleCallback(Handler.java:789) 07-26 16:10:06.382 28577-28577/com.tbmsr W/System.err: 在 android.os.Handler.dispatchMessage(Handler.java:98) 07-26 16:10:06.382 28577-28577/com.tbmsr W/System.err: 在 android.os.Looper.loop(Looper.java:164) 07-26 16:10:06.382 28577-28577/com.tbmsr W/System.err: 在 android.app.ActivityThread.main(ActivityThread.java:6541) 07-26 16:10:06.382 28577-28577/com.tbmsr W/System.err: at java.lang.reflect.Method.invoke(Native Method) 07-26 16:10:06.382 28577-28577/com.tbmsr W/System.err: 在 com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 07-26 16:10:06.382 28577-28577/com.tbmsr W/System.err: 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 07-26 16:10:06.382 28577-28577/com.tbmsr W/System.err: 由: java.lang.IllegalArgumentException: View=DecorView@3d338b[] 未附加到窗口管理器 07-26 16:10:06.382 28577-28577/com.tbmsr W/System.err: 在 android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:485) 07-26 16:10:06.382 28577-28577/com.tbmsr W/System.err: 在 android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:394) 07-26 16:10:06.382 28577-28577/com.tbmsr W/System.err: 在 android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:123) 07-26 16:10:06.382 28577-28577/com.tbmsr W/System.err: 在 android.app.Dialog.dismissDialog(Dialog.java:371) 07-26 16:10:06.382 28577-28577/com.tbmsr W/System.err: 在 android.app.Dialog.dismiss(Dialog.java:354) 07-26 16:10:06.382 28577-28577/com.tbmsr W/System.err: 在 com.tbmsr.ui.home.HomeViewModel$1.onSuccess(HomeViewModel.java:106) 07-26 16:10:06.382 28577-28577/com.tbmsr W/System.err: 在 com.tbmsr.ui.home.HomeViewModel$1.onSuccess(HomeViewModel.java:100) 07-26 16:10:06.382 28577-28577/com.tbmsr W/System.err: 在 io.reactivex.internal.operators.single.SingleObserveOn$ObserveOnSingleObserver.run(SingleObserveOn.java:81) 07-26 16:10:06.383 28577-28577/com.tbmsr W/System.err: at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:109)

【问题讨论】:

  • 崩溃日志会更有帮助。
  • 请发布崩溃日志,因为没有日志就无法为您提供帮助,但是进度对话框崩溃的常见原因之一与您创建对话框的 context 有关,当您关闭上下文不再可用的对话框时,它会导致活动 找不到窗口管理器异常
  • 我应该怎么做才能处理这个 Rajat Beck
  • 从哪里显示进度对话框?

标签: android rx-java progressdialog


【解决方案1】:

原因:java.lang.IllegalArgumentException: View=DecorView@3d338b[] 未附加到窗口管理器

是我在 cmets 中谈论的同一个异常,要处理此问题,您需要确保在销毁活动或片段时关闭对话框,在您的情况下,它即将到来,因为活动是在到达 onSuccess 之前被销毁。

要了解更多信息,请阅读this

【讨论】: