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函数中插入此代码。当我运行应用程序时,它仍然缓慢且滞后。当我使用调试器时,它向我显示“应用程序可能在其主线程上做了太多工作。”。有没有其他方法可以在后台执行任务或实现多线程。
答案 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());
这将在整个应用程序中仅加载一次字体,并且可以多次使用。除了加载字体之外,这可以帮助您完成许多其他功能。