Представление 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

Другие вопросы по тегам