有api调用时如何在没有代码重复的情况下膨胀progressBar布局

Scr*_*peW 7 java android mvvm android-progressbar retrofit2

我的应用程序中有这个流程:

声明端点:

public interface EndPoints {
    @GET(Constants.POPULAR)
    Call<AllData> getAllData(
            @Query("api_key") String apiKey
    );
}
Run Code Online (Sandbox Code Playgroud)

改造服务:

  private static EndPoints endPoints = retrofit.create(EndPoints.class);

    public static EndPoints getEndpoints() {
        return  endPoints ;
    }
Run Code Online (Sandbox Code Playgroud)

我在我的视图模型中调用它:

   private void getDataFromApi() {
    Call<AllData> call = RetrofitService.getEndPoints().getAllData(Constants.API_KEY);
    call.enqueue(new Callback<AllData>() {
        @Override
        public void onResponse(Call<AllData> call, Response<AllData> response) {

        }
            if (response.isSuccessful()) {
                _allData.setValue(response.body());
        }

        @Override
        public void onFailure(Call<AllData> call, Throwable t) {
        }
    });

}
Run Code Online (Sandbox Code Playgroud)

基础活动:

public abstract class BaseActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getLayoutId());
    }
Run Code Online (Sandbox Code Playgroud)

进度条布局(我更新了这个,而不是在每个 xml 文件中使用框架布局,我创建了一个名为进度条布局的 xml,我想在每次调用时都增加它):

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/frame_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ProgressBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"/>
</FrameLayout>
Run Code Online (Sandbox Code Playgroud)

如何设置每个 api 调用的进度条?

最初我检查getDataFromApi是否正在加载,将值设置为 boolLiveData并在我的活动中观察到这一点。

这样做的问题是大量的代码重复。

我需要设置加载状态的每个 api 调用,我需要观察加载状态和调用的每个活动View.VisibleView.Hide以及我需要创建带有进度条的框架布局的每个活动 xml。

我相信答案在基本活动的某个地方,因为它是唯一可以“控制”应用程序中所有活动的地方,但我想不出解决这个问题的方法

Ton*_*hen 0

创建一个列表来保存所有片段并监听状态:

List<FrameLayout> frameLayoutList = new ArrayList<>();
// register you own FrameLayout
frameLayoutList.add(frameLayout);

mainViewModel.getStaus().observe(this, new Observer<MainViewModel.Status>() {
    @Override
    public void onChanged(MainViewModel.Status status) {
        if (status == MainViewModel.Status.LOADING) {
            for (FrameLayout frameLayout : frameLayoutList) {
                frameLayout.setVisibility(View.VISIBLE);
            }
        } else {
            for (FrameLayout frameLayout : frameLayoutList) {
                frameLayout.setVisibility(View.GONE);
            }
            frameLayout.setVisibility(View.GONE);
        }
    }
});
Run Code Online (Sandbox Code Playgroud)