Представление Endless Scroll Recycler: приложение может выполнять слишком много работы в своем основном потоке
Я получаю ниже предупреждающие сообщения и после иногда приложение дает ANR dailog box
Skipped 368 frames! The application may be doing too much work on its main thread.
Я использую плавный для реализации бесконечной прокрутки с recycler view
,
Я перепробовал много вещей, но не работал.
Ниже мой код:
private void prepareData() {
pagination = PublishProcessor.create();
compositeDisposable = new CompositeDisposable();
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
isScrolling = true;
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
currentStories = mLayoutManager.getChildCount();
totalStories = mLayoutManager.getItemCount();
scrolledStories = ((GridLayoutManager) mLayoutManager).findFirstVisibleItemPosition();
if (!requestOnWay && (currentStories + scrolledStories == totalStories)) {
pagination.onNext(mAdapter.getLastVisibleItemId());
}
}
});
Disposable disposable = pagination.onBackpressureDrop()
.doOnNext(integer -> {
requestOnWay = true;
mAdapter.showLoader(true);
})
.concatMap((Function<Integer, Publisher<Response<News>>>) NewsFragment.this::getNews)
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(newsResponse -> {
if (newsResponse.isSuccessful() && newsResponse.body() != null) {
processData(newsResponse.body());
} else {
Log.e(TAG, newsResponse.code() + " " + newsResponse.message());
}
requestOnWay = false;
mAdapter.showLoader(false);
})
.doOnError(throwable -> {
if (throwable instanceof HttpException) {
Response<?> response = ((HttpException) throwable).response();
Log.d(TAG, response.message());
} else if (throwable instanceof UnknownHostException) {
Log.d(TAG, "News On error handling");
updateEmptyView(null);
}
})
.subscribe();
RxJavaPlugins.setErrorHandler(Functions.<Throwable>emptyConsumer());
compositeDisposable.add(disposable);
pagination.onNext(0);
}
private Flowable<Response<News>> getNews(int fromId) {
return applicationComponent.getNetwork().getNews(token, pageCount, PAGE_LIMIT)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
заранее спасибо
1 ответ
Choreographer позволяет приложениям подключаться к vsync и правильно рассчитывать время, чтобы повысить производительность.
Android-анимация для внутреннего просмотра использует Choreographer для той же цели: для правильного определения времени анимации и, возможно, для повышения производительности.
Так как Choreographer сообщается о каждом событии vsync, я могу сказать, не завершается ли один из Runnables, переданных с помощью Choreographer.post * apis, за один кадр, что приводит к пропуску кадров.
В моем понимании хореограф может только обнаружить пропуск кадра. Он не может сказать, почему это происходит.
Сообщение "Приложение может выполнять слишком много работы в своем основном потоке". Может вводить в заблуждение.
источник: смысл сообщений хореографа в Logcat