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如果我的列表是非常大的。 任何模式来优化这种问题?
谢谢:)