【问题标题】:The data is not received after the Internet is recovering上网恢复后收不到数据
【发布时间】:2020-06-28 21:15:16
【问题描述】:

我正在使用 RxJava3 和 Live 数据。

我在后台线程中调用getAllMovies和getAllGenres方法,然后将接收到的数据设置为MutableLiveData。

在我的启动活动中,我从 viewModel 调用这些方法。

我有抽签动画,每次抽签动画结束,我都会检查是否收到数据,如果收到,则打开另一个活动,否则,再次等待数据接收。

问题是当我失去互联网连接时,互联网恢复后收不到数据。

我正在尝试在 wifi 和互联网关闭时运行应用程序,然后打开 wifi。

但方法大小总是为 0。

如果我在互联网上运行应用程序,数据接收正常。

这就是我所拥有的。

应用程序库:

private MutableLiveData<List<GenreResult>> mGenresResponseMutableLiveData = new MutableLiveData<>();

public MutableLiveData<List<GenreResult>> getGenresResponseMutableLiveData() {
        AppService appService = RetrofitInstance.getService();
        appService.getAllGenres(mApplication.getResources().getString(R.string.api_key),
                mApplication.getResources().getString(R.string.language))
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<GenreResponse>() {
                    @Override
                    public void accept(GenreResponse genreResponses) throws Throwable {
                        mGenresResponseMutableLiveData.setValue(genreResponses.getGenreResults());
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Throwable {
                        Toast.makeText(mApplication.getApplicationContext(), throwable.getMessage(), Toast.LENGTH_LONG).show();
                    }
                });

        return mGenresResponseMutableLiveData;
    }

视图模型:

public class GenresViewModel extends AndroidViewModel {

    private AppRepository mRepository;

    public GenresViewModel(@NonNull Application application) {
        super(application);
        mRepository = new AppRepository(application);
    }

    public MutableLiveData<List<GenreResult>> getGenreLiveData() {
        return mRepository.getGenresResponseMutableLiveData();
    }
}

SplashActivity 调用 getGenre 方法:

private void getGenreList() {
    mGenreResultArrayList = new ArrayList<>();
    mGenresViewModel = new ViewModelProvider.AndroidViewModelFactory(getApplication()).create(GenresViewModel.class);
    mGenresViewModel.getGenreLiveData().observe(this, new Observer<List<GenreResult>>() {
        @Override
        public void onChanged(List<GenreResult> genreResults) {
            mGenreResultArrayList = (ArrayList<GenreResult>) genreResults;
        }
    });
}

SplashActivity 检查 lottie 监听器是否收到数据:

private void initViews() {
        mLAVLoader = findViewById(R.id.lavLoader);
        mLAVLoader.addAnimatorListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);
                if (mGenreResultArrayList != null && mGenreResultArrayList.size() > 0
                        && mMovieResultArrayList != null && mMovieResultArrayList.size() > 0) {
                    Intent intent = new Intent(SplashActivity.this, MainActivity.class);
                    intent.putParcelableArrayListExtra("genreList", mGenreResultArrayList);
                    intent.putParcelableArrayListExtra("moviesList", mMovieResultArrayList);
                    startActivity(intent);
                } else {
                    mLAVLoader.playAnimation();
                    Log.d("myDebug", "onAnimationEnd: " + mGenreResultArrayList.size()+ " "+mMovieResultArrayList.size());
                }
            }
        });
    }

【问题讨论】:

    标签: android rx-java android-livedata


    【解决方案1】:

    我在 Repository 中使用 retryWhen 方法修复了它:

     public MutableLiveData<List<MovieResult>> getAllMoviesMutableLiveData() {
            AppService appService = RetrofitInstance.getService();
            appService.getAllMovies(mApplication.getResources().getString(R.string.api_key),
                    mApplication.getResources().getString(R.string.language),
                    "popularity.desc")
                    .retryWhen(throwable ->
                            throwable.delay(5, TimeUnit.SECONDS))
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Consumer<MoviesResponse>() {
                        @Override
                        public void accept(MoviesResponse moviesResponse) throws Throwable {
                            mAllMoviesMutableLiveData.setValue(moviesResponse.getMovieResults());
                        }
                    }, new Consumer<Throwable>() {
                        @Override
                        public void accept(Throwable throwable) throws Throwable {
                        }
                    });
            return mAllMoviesMutableLiveData;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      • 2021-04-17
      • 2023-04-08
      • 2017-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多