2011-09-06 60 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