Android 使用AsyncTask填充ListView时的性能问题
实际上,我使用AsyncTask填充我的ListView。代码如下所示:Android 使用AsyncTask填充ListView时的性能问题,android,Android,实际上,我使用AsyncTask填充我的ListView。代码如下所示: private class MyAsyncTask extends AsyncTask<Void, Message, Void> { ArrayAdapter<Message> adapter; public MyAsyncTask{ adapter = ( ( ArrayAdapter<Message> ) mListView.getAdapte
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;
}
}
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;
}
}
私有类MyAsyncTask扩展了AsyncTask{
阵列适配器;
公共MyAsyncTask{
适配器=((ArrayAdapter)mListView.getAdapter();
}
@凌驾
受保护的void onPreExecute(){
适配器。清除();
super.onPreExecute();
}
@凌驾
受保护的void onProgressUpdate(消息…值){
adapter.add(值[0]);
super.onProgressUpdate(值);
}
@凌驾
受保护的Void doInBackground(Void…参数){
//收到我的留言
用于(消息:消息){
出版进度(信息);
}
//其他重物
返回null;
}
}
通过traceview,我发现由于在一个周期中调用publishProgress,会产生很大的开销。我认为这样修改代码:
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;
}
}
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;
}
}
私有类MyAsyncTask扩展了AsyncTask{
阵列适配器;
列出信息;
公共MyAsyncTask{
适配器=((ArrayAdapter)mListView.getAdapter();
}
@凌驾
受保护的void onPreExecute(){
适配器。清除();
super.onPreExecute();
}
@凌驾
受保护的void onProgressUpdate(void…值){
用于(消息:消息){
adapter.add(消息);
}
super.onProgressUpdate(值);
}
@凌驾
受保护的Void doInBackground(Void…参数){
messages=//获取我的消息
出版进度();
//其他重物
返回null;
}
}
这一行看起来更快,因为在后台线程和ui线程之间发送的消息更少,但如果我的列表很大,我恐怕会遇到ANR。
有什么模式可以优化这类问题吗
谢谢:)
通过traceview,我发现由于在一个周期中调用publishProgress,会产生很大的开销
这有点令人惊讶
有什么模式可以优化这类问题吗
将项目添加到doInBackground()
中的适配器中,并执行其他操作作为进度指示器,例如ProgressBar