0
實際上,我使用AsyncTask來填充ListView。代碼看起來像這樣:使用AsyncTask填充ListView時的性能問題
private class MyAsyncTask extends AsyncTask<Void, Message, Void> {
ArrayAdapter<Message> adapter;
public MyAsyncTask{
adapter = ((ArrayAdapter<Message>) mListView.getAdapter();
}
@Override
protected void onPreExecute() {
adapter.clear();
super.onPreExecute();
}
@Override
protected void onProgressUpdate (Message... values) {
adapter.add(values[0]);
super.onProgressUpdate(values);
}
@Override
protected Void doInBackground (Void... params) {
//Getting my messages
for (Message message : messages) {
publishProgress(message);
}
//Other heavy stuff
return null;
}
}
隨着traceview我看到有一個大的開銷,由於被稱爲一個週期內publishProgress。我認爲要修改這樣的代碼:
private class MyAsyncTask extends AsyncTask<Void, Message, Void> {
ArrayAdapter<Message> adapter;
List<Message> messages;
public MyAsyncTask{
adapter = ((ArrayAdapter<Message>) mListView.getAdapter();
}
@Override
protected void onPreExecute() {
adapter.clear();
super.onPreExecute();
}
@Override
protected void onProgressUpdate (Void... values) {
for(Message message: messages){
adapter.add(message);
}
super.onProgressUpdate(values);
}
@Override
protected Void doInBackground (Void... params) {
messages = //Getting my messages
publishProgress();
//Other heavy stuff
return null;
}
}
這看起來線條更加快速,因爲有較少的消息給後臺線程和UI線程之間傳遞,但我怕跑成ANR如果我的列表是非常大的。 任何模式來優化這種問題?
謝謝:)