如何在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
相关产品推荐
相关产品推荐

