异步更新ListView

时间:2018-01-01 05:43:47

标签: java android

我正在处理以下api调用https://pokeapi.co/api/v2/pokemon/,问题是它似乎很慢并且每个条目本身都有几个端点。是否可以在进行ListView调用时异步更新api?我觉得它可能类似于使用端点的下一个和上一个键以及触发listener事件来更新ListviewAsyncTask's doInBackground方法中的onProgressUpdate 。我感谢任何帮助,我觉得我有一个想法的开始,但我需要帮助完成这个想法。

1 个答案:

答案 0 :(得分:1)

你绝对可以通过AsyncTask实现它,但我宁愿建议使用RxJava的解决方案。

您可以实施 RxJava Chaining

共享代码片段,了解如何使用RxJava进行链接调用。

 private void fetchHackerNewsStoriesChaining() {

        StoriesApiInterface storiesApiInterface = HackerNewsApiClient.getStoriesApiInterface();
        storiesApiInterface.getTopStories()
                .flatMapIterable(new Function<JsonArray, Iterable<?>>() {
                    @Override
                    public Iterable<?> apply(JsonArray jsonArray) throws Exception {
                        Log.d("Count", ""+jsonArray.size());
                        return jsonArray;
                    }
                })
                .flatMap(new Function<Object, ObservableSource<SingleStoryModelResponse>>() {
                    @Override
                    public ObservableSource<SingleStoryModelResponse> apply(Object newsId) throws Exception {

                        return HackerNewsApiClient.getStoryDetailsApiInterface().getNewsStoryDetail(((JsonElement) newsId).getAsLong())
                                .subscribeOn(Schedulers.io());
                    }
                })
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                .subscribe(new Observer<SingleStoryModelResponse>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        progressBar.setVisibility(View.VISIBLE);
                    }

                    @Override
                    public void onNext(SingleStoryModelResponse singleStoryModelResponse) {
                        adapterNewsList.addNewsItem(singleStoryModelResponse);
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.d("Hacker News", e.getMessage());
                    }

                    @Override
                    public void onComplete() {
                        progressBar.setVisibility(View.GONE);
                    }
                });
    }