【问题标题】:The application may be doing too much work on its main thread. Even though I have used Asynctask应用程序可能在其主线程上做了太多工作。即使我使用过 Asynctask
【发布时间】:2015-04-18 10:48:56
【问题描述】:
new AsyncTask<Void, Void, Void>() {
        @Override
        protected Void doInBackground(Void... params) {
            initJourneyStatusList();
            adapterJourneyStatus = new ArrayAdapter(getApplicationContext(), android.R.layout.simple_spinner_item,listJourneyStatus) {
                @Override
                public View getView(int position, View convertView, ViewGroup parent) {
                    View v = super.getView(position, convertView, parent);
                    ((TextView) v).setTypeface(Typeface.createFromAsset(getAssets(), "fonts/calibri.ttf"));
                    ((TextView) v).setTextColor(getResources().getColor(android.R.color.black));
                    return v;
                }

                @Override
                public View getDropDownView(int position,  View convertView,  ViewGroup parent) {
                    View v =super.getDropDownView(position, convertView, parent);
                    ((TextView) v).setTypeface(Typeface.createFromAsset(getAssets(),"fonts/calibri.ttf"));
                    ((TextView) v).setTextColor(getResources().getColor(android.R.color.black));
                    return v;
                }
            };
            adapterJourneyStatus.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            spinnerJourneyStatus.setAdapter(adapterJourneyStatus);
            return null;
        }
    }.execute();

我已将此代码插入到 onCreate 函数中。当我运行应用程序时,它仍然很慢而且滞后。当我使用调试器时,它向我显示“应用程序可能在其主线程上做了太多工作。”。有没有其他方法可以在后台执行任务或实现多线程。

【问题讨论】:

  • 在 OnPostExecute() 而不是 doInBackground() 中初始化-设置您的适配器
  • @HareshChhelana 是正确的,android 不支持从后台线程访问 UI 组件。不过,这不是解决问题的办法。你读过stackoverflow.com/questions/14678593/…吗?
  • 正如其他人所建议的那样,似乎有些问题。尝试在后台线程上调用 setAdapter() 应该会崩溃。另外,不要在这里使用getApplicationContext()。关于您所花费的时间,请使用 Traceview 来确定到底出了什么问题。

标签: android android-asynctask


【解决方案1】:

除了其他人已经说过的好 cmets,您正在(在 UI 线程上)多次创建字体(每个列表行至少一次),这是一个缓慢的操作。只创建一次字体并将它们保存为局部成员变量

【讨论】:

    【解决方案2】:

    doInBackground() 不在 UI 线程中运行,因此您无法在其中执行任何 UI 线程的操作,因此请尝试移动适配器初始化并在 OnPostExecute() 中设置代码。

    private void setJourneyStatusList(final Context context){
            new AsyncTask<Void, Void, Void>() {
                @Override
                protected Void doInBackground(Void... params) {
                    initJourneyStatusList();
                    return null;
                }
    
                @Override
                protected void onPreExecute() {
                    super.onPreExecute();
                    adapterJourneyStatus = new ArrayAdapter(context, android.R.layout.simple_spinner_item,listJourneyStatus) {
                        @Override
                        public View getView(int position, View convertView, ViewGroup parent) {
                            View v = super.getView(position, convertView, parent);
                            ((TextView) v).setTypeface(Typeface.createFromAsset(getAssets(), "fonts/calibri.ttf"));
                            ((TextView) v).setTextColor(getResources().getColor(android.R.color.black));
                            return v;
                        }
    
                        @Override
                        public View getDropDownView(int position,  View convertView,  ViewGroup parent) {
                            View v =super.getDropDownView(position, convertView, parent);
                            ((TextView) v).setTypeface(Typeface.createFromAsset(getAssets(),"fonts/calibri.ttf"));
                            ((TextView) v).setTextColor(getResources().getColor(android.R.color.black));
                            return v;
                        }
                    };
                    adapterJourneyStatus.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                    spinnerJourneyStatus.setAdapter(adapterJourneyStatus);
                }
            }.execute();
        }
    

    【讨论】:

      【解决方案3】:

      尝试使用单例类以减少重复缓慢操作的次数。例如,加载字体是一项缓慢的操作。试试单例类,

      public class ClassName {
          private static ClassName instance;
          public TypeFace fontToLoad;
      
          public static ClassName getInstance() {
               if (instance == null)
                     instance = new ClassName();
               return instance;
          }
      
          public void loadFonts(Activity activity) {
               fontToLoad = Typeface.createFromAsset(activity.getAssets(), "fonts/calibri.ttf");
          }
      
          public TypeFace font() {
               return fontToLoad;
          }
      }
      

      现在,在应用程序启动时使用这个单例类(即启动器活动)来加载字体,

      private ClassName className = ClassName.getInstance();
      

      在 onCreate 函数中,

      className.loadFonts(this);
      

      现在你想在哪里使用字体,像这样使用它,

      private ClassName className = ClassName.getInstance();
      

      对于editText或任何视图,

      editText.setTypeFace(className.font());
      

      这将在整个应用程序中仅加载一次字体,并且可以多次使用。除了加载字体之外,这可能会帮助您完成许多其他功能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多