You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Firebase提交成功后从其他类停止MainActivity的ProgressBar?

解决Firebase数据插入后停止ProgressBar的问题

我来帮你搞定这个问题!你目前的核心痛点是FormDetailsServices类没法直接操作ProductDetails里的ProgressBar,毕竟它们是两个独立的类。我们可以通过回调机制让数据提交的结果通知到Activity,再由Activity来控制ProgressBar的状态。下面给你两种实用的解决方案:

方案一:自定义回调接口(推荐,解耦业务与UI)

这种方式遵循单一职责原则,让FormDetailsServices只负责数据提交逻辑,把结果通过接口回调给Activity处理UI操作。

步骤1:在FormDetailsServices中定义回调接口

public class FormDetailsServices {
    Context context;
    final String TAG = "FormDetailsServices";

    // 自定义回调接口,用于通知提交结果
    public interface FormSubmitListener {
        void onSubmitSuccess();
        void onSubmitFailure(String errorMessage);
    }

    public FormDetailsServices(Context context) {
        this.context = context;
    }

    // 省略getter/setter...

    // 修改submitForm方法,添加回调参数
    public void submitForm(FormDTO formDTO, FirebaseDatabase firebaseDatabase, FormSubmitListener listener) {
        firebaseDatabase
                .getReference()
                .child("test")
                .setValue(formDTO)
                .addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                        Log.d(TAG,"form submitted Successfully");
                        // 通知Activity提交成功
                        listener.onSubmitSuccess();
                    }
                }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                String errorMsg = e.getMessage();
                Log.d(TAG,"form submittion Failed exception msg= " + errorMsg);
                // 通知Activity提交失败
                listener.onSubmitFailure(errorMsg);
            }
        });
    }
}

步骤2:在ProductDetails中实现回调,控制ProgressBar

public class ProductDetails extends AppCompatActivity {
    ProgressBar progressbar;
    Button btn;
    FirebaseDatabase firebaseDatabase;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_product_details);
        progressbar = findViewById(R.id.btnprogressbar);
        btn = findViewById(R.id.submit_btn);
        firebaseDatabase = FirebaseDatabase.getInstance();
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                progressbar.setVisibility(View.VISIBLE);
                submitForm();
            }
        });
    }

    private void submitForm() {
        FormDetailsServices formDetailsServices = new FormDetailsServices(ProductDetails.this);
        FormDTO formDTO=generateForDTO();
        // 实现回调接口,处理提交结果
        formDetailsServices.submitForm(formDTO,firebaseDatabase, new FormDetailsServices.FormSubmitListener() {
            @Override
            public void onSubmitSuccess() {
                // 确保在主线程更新UI(Firebase回调默认在主线程,但加上更保险)
                runOnUiThread(() -> {
                    progressbar.setVisibility(View.GONE);
                    Toast.makeText(ProductDetails.this, "表单提交成功", Toast.LENGTH_SHORT).show();
                });
            }

            @Override
            public void onSubmitFailure(String errorMessage) {
                runOnUiThread(() -> {
                    progressbar.setVisibility(View.GONE);
                    Toast.makeText(ProductDetails.this, "提交失败:"+errorMessage, Toast.LENGTH_SHORT).show();
                });
            }
        });
    }

    // 省略generateForDTO方法...
}

方案二:直接传递Firebase的监听接口(更简洁)

如果不想自定义接口,也可以直接把Firebase的OnSuccessListener和OnFailureListener传递给submitForm方法,在Activity中直接处理UI:

修改FormDetailsServices的submitForm方法

public void submitForm(FormDTO formDTO, FirebaseDatabase firebaseDatabase, OnSuccessListener<Void> successListener, OnFailureListener failureListener) {
    firebaseDatabase
            .getReference()
            .child("test")
            .setValue(formDTO)
            .addOnSuccessListener(successListener)
            .addOnFailureListener(failureListener);
}

在ProductDetails中调用并处理

private void submitForm() {
    FormDetailsServices formDetailsServices = new FormDetailsServices(ProductDetails.this);
    FormDTO formDTO=generateForDTO();
    formDetailsServices.submitForm(formDTO,firebaseDatabase, 
        success -> {
            progressbar.setVisibility(View.GONE);
            Toast.makeText(ProductDetails.this, "提交成功", Toast.LENGTH_SHORT).show();
        }, 
        e -> {
            progressbar.setVisibility(View.GONE);
            Toast.makeText(ProductDetails.this, "提交失败:"+e.getMessage(), Toast.LENGTH_SHORT).show();
        });
}

注意事项

  • 用View.GONE而不是View.INVISIBLE隐藏ProgressBar,这样它不会占用布局空间,体验更好;
  • 虽然Firebase的回调默认在主线程执行,但加上runOnUiThread可以避免特殊情况下的UI线程异常;
  • 失败场景也要隐藏ProgressBar,避免用户一直看到加载状态。

内容的提问来源于stack exchange,提问作者bhaskarkh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 08:47:33