2011-09-06 58 views
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如果我的列表是非常大的。 任何模式来优化这种问题?

谢谢:)

回答

1

随着traceview我看到有一个大的开销,由于被称为一个周期内publishProgress。

这有点令人惊讶。

任何模式来优化这类问题?

添加项目到您的适配器在doInBackground()和做别的事情的进度指标,如ProgressBar