Тайм-аут диспетчеризации ввода ANR

Я часто получаю следующее ANR в своем приложении

Input dispatching timed out (Waiting to send key event because the focused window has not finished processing all of the input events that were previously delivered to it. Outbound queue length: 0. Wait queue length: 1.)

лог говорит, что проблема в методе onActivityStopped

это код, который я добавил в этот метод

try {
            boolean foreground = new ForegroundCheckTask().execute(getApplicationContext()).get();
            if(!foreground) {

                AdServerManager.getInstance().incrementImpression(activity, ForSaleDataManager.getInstance().getBannerImpression(),
                        ForSaleDataManager.getInstance().getOfferImpression(), new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {

                                ForSaleDataManager.getInstance().clearOfferImpression();
                                ForSaleDataManager.getInstance().clearBannerImpression();
                            }
                        });

                String lastOffers = TextUtils.join("," , ForSaleDataManager.getInstance().getVisitedOffersIds());
                //Appboy.getInstance(activity).getCurrentUser().setCustomUserAttribute(AppBoyAttributeName.LAST_TEN_OFFER_IDS.getValue() , lastOffers);
                ForSaleDataManager.getInstance().clearVisitedOffersIds();

                String lastCategories = TextUtils.join("," , ForSaleDataManager.getInstance().getVisitedCategoriesIds());
                //Appboy.getInstance(activity).getCurrentUser().setCustomUserAttribute(AppBoyAttributeName.LAST_TEN_CATEGORY_IDS.getValue() , lastCategories);
                ForSaleDataManager.getInstance().clearVisitedCategoriesIds();

                String lastSearch = TextUtils.join("," , ForSaleDataManager.getInstance().getVisitedSearchTerms());
                //Appboy.getInstance(activity).getCurrentUser().setCustomUserAttribute(AppBoyAttributeName.LAST_TEN_SEARCH_TERMS.getValue() , lastSearch);
                ForSaleDataManager.getInstance().clearVisitedSearchTerms();

                // clear landing page
                PhoneUtils.addBooleanToSharedPreference(activity, ForSaleConstants.IS_CATEGORIES_LANDING_SHOWEN, false);
                PhoneUtils.addBooleanToSharedPreference(activity, ForSaleConstants.IS_LISTING_LANDING_SHOWEN, false);
                PhoneUtils.deleteWithPrefixFromSharedPreference(activity, ForSaleConstants.IS_SUB_CATEGORIES_LANDING_SHOWEN_PREFIX, false);
                PhoneUtils.deleteWithPrefixFromSharedPreference(activity, ForSaleConstants.IS_SUB_CATEGORIES_LANDING_SHOWEN, false);


                // reset for last activity
                PhoneUtils.addBooleanToSharedPreference(activity, ForSaleConstants.SET_LAST_ACTIVITY_CALLED, false);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

системное требование моего приложения, что я должен отправить некоторые данные на сервер, а также очистить локальные данные, поэтому я реализовал интерфейс Application.ActivityLifecycleCallbacks

Кто-нибудь может посоветовать, как удовлетворить мои системные требования без генерации ANR?

ИЗМЕНИТЬ

это код после того, как я поместил его в AsyncTask, и он не работает

@Override
    public void onActivityStopped(final Activity activity) {

        //new AsyncTask<Void, Void, Void>() {

            //@Override
            //protected Void doInBackground(Void... voids) {

                try {
                    boolean foreground = new ForegroundCheckTask().execute(getApplicationContext()).get();
                    if(!foreground) {

                        AdServerManager.getInstance().incrementImpression(activity, ForSaleDataManager.getInstance().getBannerImpression(),
                                ForSaleDataManager.getInstance().getOfferImpression(), new View.OnClickListener() {
                                    @Override
                                    public void onClick(View v) {

                                        ForSaleDataManager.getInstance().clearOfferImpression();
                                        ForSaleDataManager.getInstance().clearBannerImpression();
                                    }
                                });

                        String lastOffers = TextUtils.join("," , ForSaleDataManager.getInstance().getVisitedOffersIds());
                        //Appboy.getInstance(activity).getCurrentUser().setCustomUserAttribute(AppBoyAttributeName.LAST_TEN_OFFER_IDS.getValue() , lastOffers);
                        ForSaleDataManager.getInstance().clearVisitedOffersIds();

                        String lastCategories = TextUtils.join("," , ForSaleDataManager.getInstance().getVisitedCategoriesIds());
                        //Appboy.getInstance(activity).getCurrentUser().setCustomUserAttribute(AppBoyAttributeName.LAST_TEN_CATEGORY_IDS.getValue() , lastCategories);
                        ForSaleDataManager.getInstance().clearVisitedCategoriesIds();

                        String lastSearch = TextUtils.join("," , ForSaleDataManager.getInstance().getVisitedSearchTerms());
                        //Appboy.getInstance(activity).getCurrentUser().setCustomUserAttribute(AppBoyAttributeName.LAST_TEN_SEARCH_TERMS.getValue() , lastSearch);
                        ForSaleDataManager.getInstance().clearVisitedSearchTerms();

                        // clear landing page
                        PhoneUtils.addBooleanToSharedPreference(activity, ForSaleConstants.IS_CATEGORIES_LANDING_SHOWEN, false);
                        PhoneUtils.addBooleanToSharedPreference(activity, ForSaleConstants.IS_LISTING_LANDING_SHOWEN, false);
                        PhoneUtils.deleteWithPrefixFromSharedPreference(activity, ForSaleConstants.IS_SUB_CATEGORIES_LANDING_SHOWEN_PREFIX, false);
                        PhoneUtils.deleteWithPrefixFromSharedPreference(activity, ForSaleConstants.IS_SUB_CATEGORIES_LANDING_SHOWEN, false);


                        // reset for last activity
                        PhoneUtils.addBooleanToSharedPreference(activity, ForSaleConstants.SET_LAST_ACTIVITY_CALLED, false);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    e.printStackTrace();
                }

                //return null;
        //    }
        //}.execute();


    }

person Amira Elsayed Ismail    schedule 13.11.2017    source источник


Ответы (1)


Переместите всю эту логику в фоновый поток. Вот как вы решаете любой ANR, который исходит из вашего кода.

person CommonsWare    schedule 13.11.2017
comment
это не работает. Я перемещаю предыдущий код в AsyncTask, он не работает, и когда я перемещаю приложение в фоновый режим и возвращаю его на передний план, оно закрывается и снова открывается, и, пожалуйста, проверьте мое редактирование, чтобы просмотреть мой код - person Amira Elsayed Ismail; 14.11.2017
comment
@AmiraElsayedIsmail: ваш второй блок кода, похоже, такой же, как и первый блок кода, за исключением большего отступа и некоторых комментариев. Кроме того, я понятия не имею, что означает «не работает», и я понятия не имею, что означает «закрыть и снова открыть». - person CommonsWare; 14.11.2017
comment
Я использовал второй блок кода, но наверняка без закомментированной части, и код, который не работает, - это код внутри doinBackground(), и последний момент, когда я помещаю приложение в фоновый режим, пока я нахожусь в HomeActivity, а затем, когда я его приношу вернитесь на передний план, откройте приложение SplashActivity и запустите снова - person Amira Elsayed Ismail; 14.11.2017
comment
@AmiraElsayedIsmail: код, который не работает, — это код внутри doinBackground() — это не объясняет, что означает «не работает». Имейте в виду, что вы не должны ссылаться на Activity из фонового потока, так как он может быть уничтожен до завершения вашего потока. Вместо этого сначала соберите данные, которые вам нужны, из действия, затем разветвите поток и обработайте эти собранные данные. - person CommonsWare; 14.11.2017