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.Visible,View.Hide以及我需要创建带有进度条的框架布局的每个活动 xml。
我相信答案在基本活动的某个地方,因为它是唯一可以“控制”应用程序中所有活动的地方,但我想不出解决这个问题的方法
创建一个列表来保存所有片段并监听状态:
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)
| 归档时间: |
|
| 查看次数: |
569 次 |
| 最近记录: |