应用程序可能在其主线程上做了太多工作。即使我使用过Asynctask

时间:2015-04-18 10:48:57

标签: android android-asynctask

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

3 个答案:

答案 0 :(得分:1)

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();
    }

答案 1 :(得分:1)

除了其他人已经说过的好评之外,你在(在UI线程上)创建了多次字体(每个列表行至少一次),这是一个缓慢的操作。仅创建一次字体并将其另存为本地成员变量

答案 2 :(得分:0)

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

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());

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