【问题标题】:How can I retry to connect with the server using RXJava and Retrofit?如何使用 RXJava 和 Retrofit 重试连接服务器?
【发布时间】:2022-01-05 09:59:15
【问题描述】:

代码

new Retrofit.Builder().baseUrl(Constants.BASE_URL_FILES).addCallAdapterFactory(RxJava3CallAdapterFactory.create()).addConverterFactory(GsonConverterFactory.create()).build().create(RetrofitInterface.class).getCountries().observeOn(AndroidSchedulers.mainThread()).subscribe(new SingleObserver<List<CountryModel>>() {
    @Override
    public void onSubscribe(@io.reactivex.rxjava3.annotations.NonNull Disposable d) {
        MainActivity.activityMainBinding.activityMainLinearProgressIndicatorLoading.setVisibility(View.VISIBLE);
    }

    @Override
    public void onSuccess(@io.reactivex.rxjava3.annotations.NonNull List<CountryModel> countryModels) {
        fragmentCountriesBinding.fragmentCountriesRecyclerViewCountries.setAdapter(new CountriesAdapter(requireContext(), countryModels));
        MainActivity.activityMainBinding.activityMainLinearProgressIndicatorLoading.setVisibility(View.GONE);
    }

    @Override
    public void onError(@io.reactivex.rxjava3.annotations.NonNull Throwable e) {
        MainActivity.activityMainBinding.activityMainLinearProgressIndicatorLoading.setVisibility(View.GONE);
        if (!MainActivity.isNetworkConnected(requireContext()))
            Snackbar.make(MainActivity.activityMainBinding.getRoot(), R.string.no_internet, BaseTransientBottomBar.LENGTH_INDEFINITE).setMaxInlineActionWidth(1).setAction(R.string.retry, view ->
            {

            }).show();
        else
            Snackbar.make(MainActivity.activityMainBinding.getRoot(), R.string.something_went_wrong, BaseTransientBottomBar.LENGTH_INDEFINITE).setMaxInlineActionWidth(1).show();
    }
});

改造界面

public interface RetrofitInterface {

    @GET("GetCountries.php")
    Single<List<CountryModel>> getCountries();

}

国家模式

public class CountryModel {

    private int countryId;
    private String countryName, countryIcon;

    public int getCountryId() {
        return countryId;
    }

    public String getCountryName() {
        return countryName;
    }

    public String getCountryIcon() {
        return countryIcon;
    }

}

正如您在onError 方法中看到的那样,我希望当用户单击重试按钮时必须再次重试与服务器的调用。

我花了 3 天时间尝试阅读有关 retryWhen 方法的文章并尝试理解此图像但我无法理解它,而且我不知道如何在我的场景中使用它。

我的问题就是这样question,我为可以帮助我的人留下了赏金,你可以在这里留下你的答案并在那里分享你的答案,直到我可以给你赏金。

【问题讨论】:

    标签: java android retrofit2 rx-java rx-java2


    【解决方案1】:

    我没有找到任何解决方案,因此我决定使用retryUntil 而不是retryWhen,因为我没有找到任何答案。

    【讨论】:

      【解决方案2】:

      我的解决方案很简单,只是临时/破解,而不是花费几天时间使用 retryWhen()。 - 下面的代码我将您的请求调用封装到一个函数中。 - 如果出现网络错误,只需对函数进行递归调用,直到成功为止。

          private void sendRequest(){
      new Retrofit.Builder().baseUrl(Constants.BASE_URL_FILES).addCallAdapterFactory(RxJava3CallAdapterFactory.create()).addConverterFactory(GsonConverterFactory.create()).build().create(RetrofitInterface.class).getCountries().observeOn(AndroidSchedulers.mainThread()).subscribe(new SingleObserver<List<CountryModel>>() {
      @Override
      public void onSubscribe(@io.reactivex.rxjava3.annotations.NonNull Disposable d) {
          MainActivity.activityMainBinding.activityMainLinearProgressIndicatorLoading.setVisibility(View.VISIBLE);
      }
      
      @Override
      public void onSuccess(@io.reactivex.rxjava3.annotations.NonNull List<CountryModel> countryModels) {
          fragmentCountriesBinding.fragmentCountriesRecyclerViewCountries.setAdapter(new CountriesAdapter(requireContext(), countryModels));
          MainActivity.activityMainBinding.activityMainLinearProgressIndicatorLoading.setVisibility(View.GONE);
      }
      
      @Override
      public void onError(@io.reactivex.rxjava3.annotations.NonNull Throwable e) {
          MainActivity.activityMainBinding.activityMainLinearProgressIndicatorLoading.setVisibility(View.GONE);
          if (!MainActivity.isNetworkConnected(requireContext()))
              Snackbar.make(MainActivity.activityMainBinding.getRoot(), R.string.no_internet, BaseTransientBottomBar.LENGTH_INDEFINITE).setMaxInlineActionWidth(1).setAction(R.string.retry, view ->
              {
      
              }).show();
          // IF NO NETWORK AVAILABLE just do recursive call of the method
         sendRequest();
          else
              Snackbar.make(MainActivity.activityMainBinding.getRoot(), R.string.something_went_wrong, BaseTransientBottomBar.LENGTH_INDEFINITE).setMaxInlineActionWidth(1).show();
      }
      

      }); }

      【讨论】:

      • 我知道这种方法,但我需要彻底的解决方案
      猜你喜欢
      • 1970-01-01
      • 2018-10-26
      • 1970-01-01
      • 2017-03-18
      • 2016-10-28
      • 1970-01-01
      • 2014-10-22
      • 1970-01-01
      • 2018-02-22
      相关资源
      最近更新 更多