【问题标题】:How to handle Android LiveData(ViewModel) with ProgressBar on screen rotate?如何在屏幕旋转时使用 ProgressBar 处理 Android LiveData(ViewModel)?
【发布时间】:2018-01-13 12:00:21
【问题描述】:

onChanged 我正在更新 UI 并取消 progressDialog 但每次我旋转屏幕时都会显示进度对话框并且 ProgressDialog 不会关闭

如果数据没有变化,进度对话框如何处理?

 final ProgressDialog pd;
    pd=new ProgressDialog(mContext);
    pd.setMessage(mContext.getString(R.string.updating));
    pd.show();MutableLiveData<BillGetResponse> DisplayByIdLiveData=viewModelForBillDisplay.getBillGetResponseDisplayById(txnRequest);

    if (display_by_id) {


        DisplayByIdLiveData.observe(BillDisplayFragment.this, new Observer<BillGetResponse>() {


            @Override
            public void onChanged(@Nullable BillGetResponse billGetResponse) {


                if (btnRecordDisableEnabled != null)
                    btnRecordDisableEnabled.enable();

                pd.dismiss();  }

但是每次onChanged 没有被触发并且progressdialog 不会停止!!

【问题讨论】:

  • 邮政编码显示 ProgressDialog 并隐藏它
  • 已更新答案...请不要介意编辑@Akhil
  • 第一次 对话框正确关闭* 但随着屏幕旋转,对话框不断出现......(因为 onChanged 只被调用一次)..

标签: android viewmodel progressdialog


【解决方案1】:

您需要其他观察者来处理布尔值,该值指示您是否必须显示 ProgressDialog。这是代码:

viewModel.getIsLoading().observe(this, new Observer<Boolean>() {
        @Override
        public void onChanged(@Nullable Boolean aBoolean) {
            if(aBoolean){
                pd.show();
            }else{
                pd.dismiss();
            }
        }
    });

在您的 viewModel 中添加 getIsLoading 方法:

public LiveData<Boolean> getIsLoading(){
    LiveData<Boolean> isLoading=yourRepository.getIsLoading();
    return isLoading;
}

并在您的存储库中添加:

private final MutableLiveData<Boolean> isLoading=new MutableLiveData<>();

并在开始和完成数据上传时将值设置为isLoading。

希望对你有帮助。

【讨论】:

    【解决方案2】:

    onChanged()没有被调用是完全正常的,这意味着数据没有更多的变化。

    我猜您想在获取或加载数据时显示 ProgressDialog。你可以这样做

    onCreate()显示之前检查数据是否存在,下面在伪代码中显示ProgressDialog

    if (!hasData())
       displayProgressDialog()
    

    编辑: 似乎您想通过显示 ProgressDialog 来通知用户数据已更改,您可以通过显示一小会儿并在一段时间后将其关闭来实现这一点,onChanged()中的类似内容@

        @Override
        public void onChanged(@Nullable BillGetResponse billGetResponse) {
            if (btnRecordDisableEnabled != null)
                btnRecordDisableEnabled.enable();
    
            displayProgressDialog(); //Show progress dialog here
            new Handler().postDelayed(new Runnable(){
                @Override
                public void run() {
                    pd.dismiss();   
                }
            },500);
        }
    

    【讨论】:

    • 我已经使用了片段并且片段被重复使用一旦加载数据,hasData() 始终为真如果片段加载对话框不会显示第二次...
    • 你明白我的意思了吗?? 第二次如果数据不同onChanged 将被调用,但之前不会显示进度..
    • 如果数据发生变化,它会显示一个空白屏幕,并且在响应到来并加载数据后,进度对话框会显示一段时间......
    • 我只是想避免用户看到空白屏幕...在任何数据加载之前...
    • 您也应该在 onCreate 中使用第一个代码 sn-p...即,如果没有数据,则在 onCreate 中也显示 ProgressDialog
    猜你喜欢
    • 2020-10-23
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    • 2021-11-12
    • 2011-02-06
    相关资源
    最近更新 更多