android - 输入调度超时 ANR

标签 android android-anr-dialog

我的应用程序中经常出现以下 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();
        }

我的应用程序的系统要求是我必须向服务器发送一些数据并清除本地数据,所以我实现了接口(interface) 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();


    }

最佳答案

将所有这些逻辑移到后台线程中。这就是您解决来自您的代码的任何 ANR 的方法。

关于android - 输入调度超时 ANR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47267686/

相关文章:

android - support.FragmentManager源码中mAdded和mActive的区别

android - 是什么导致了ANR?

Android 日志消息 "InputMethodManager: The current service view is not the focus view"

android - com.google.android.googlequicksearchbox :search 中的 ANR

android - 如何查看磨损应用程序的 CRASHES 和 ANRS

android - 是否可以在 Android 中获得视频的分辨率?

android - Spring Android REST 模板解析内容类型为 text/html 的 JSON 数据

android - 计时器线程刷新android上的 fragment

java - Android USB 连接状态;

Android 在调试时没有响应。如果不在调试应用程序中正常工作