使用翻新进行多个异步请求

时间:2019-11-21 09:38:23

标签: android api retrofit

在我的android应用程序中,我有一个屏幕,其中有3个需要微调的微调器 通过API调用填充。

static List<TripCode> tripCodeList = new ArrayList<>();
static List<Fleet> truckList = new ArrayList<>();
static List<Trailer> trailerList = new ArrayList<>();

除非我从所有3个不同的API调用中获得响应,否则我不想膨胀布局,所以这就是我正在做的

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        context = this;

        if (MyApplication.isConnected()) {
            getTripCodes();
        } else {
            Toast.makeText(this, "No internet Connection", Toast.LENGTH_LONG).show();
            setContentView(R.layout.no_internet_connection);
        }
    }

基本上,我删除了setContentView(R.layout.activity_create_trip); 来自onCreate()的电话,我打电话给getTripCodes()

这是getTripCodes()

的代码
   public void getTripCodes() {

        MyApplication.showProgressDialog(getString(R.string.please_wait), this);
        IMyAPI iMyAPI = MyApplication.getIMyAPI();
        Call<List<TripCode>> call = iMyAPI.getTripCodes();

        call.enqueue(new Callback<List<TripCode>>() {
            @Override
            public void onResponse(Call<List<TripCode>> call, Response<List<TripCode>> response) {

                if (response.isSuccessful() && response.body() != null) {
                    tripCodeList = response.body();
                    Log.d("test", "getTripCodes success = " + tripCodeList.size());
                    getTrucks();
                } else {
                    MyApplication.dismissProgressDialog();

                }
            }

            @Override
            public void onFailure(Call<List<TripCode>> call, Throwable t) {
                MyApplication.dismissProgressDialog();
            }
        });

    }

因此,在调用成功后,我正在调用另一个也从API获取结果的函数getTrucks(),在调用成功后,它将调用getTrailers()

但是我认为这是浪费时间,因为我可以同时并行调用这三个函数,然后检查所有列表是否都已填充。

但是我不知道该怎么做。如何检查所有通话是否成功?如果其中之一失败了,我怎么知道哪一个完全失败了?

1 个答案:

答案 0 :(得分:0)

我相信您的问题,您可以轻松使用具有协程支持的Retrofit 2.6.0,并且可以将所有函数声明为已暂停函数,并使用async/launch分派器分派它们,如果要在在某些情况下,请使用await()等待结果。

并将RxJava / liveData用于响应式用户界面

您的示例代码如下

//maybe from Activity for ViewModel you can use ViewModelScope
GlobalScope.launch{
 result1= async{ getTripCodes() }
 result2= async{ getTrucks() }
 result3= async{ getTrailers() }
 doSomethingWithTripCodes(result1.await())
 doSomethingWIthTrucks(result2.await())
 doSomethingTrailers(result3.await())
}

参考: