CursorAdapters Android, ListViews e fios fundo

votos
2

Esta aplicação Eu estive trabalhando tem bancos de dados com vários megabytes de dados para peneirar. Muitas das atividades são apenas ListViews descendente através de vários níveis de dados dentro dos bancos de dados até chegarmos documentos, que é apenas HTML para ser puxado a partir do DB (s) e exibido no telefone. O problema que estou tendo é que algumas dessas atividades precisam ter a capacidade de pesquisar as bases de dados através da captura de teclas digitadas e re-executar a consulta com um como% blá% nele. Isso funciona razoavelmente rápido, exceto quando o usuário é primeiro carregamento dos dados e quando o usuário entra pela primeira vez uma combinação de teclas. Eu estou usando um ResourceCursorAdapter e eu estou gerando o cursor em uma discussão de fundo, mas, a fim de fazer um listAdapter.changeCursor (), eu tenho que usar um manipulador para postá-lo para o principal segmento.apenas o tempo suficiente para abrir o diálogo ANR temida. Estou curioso para saber como eu posso descarregar isto a uma discussão de fundo totalmente assim que a interface de usuário continua a responder e não temos diálogos ANR aparecendo.

Apenas para a divulgação completa, eu estava originalmente retornar um ArrayList de objetos modelo personalizado e usando um ArrayAdapter, mas (compreensivelmente) o cliente apontou que era ruim memória de manangement e eu não estava feliz com o desempenho de qualquer maneira. Eu realmente gostaria de evitar uma solução onde eu estou gerando enormes listas de objetos e, em seguida, fazendo um listAdapter.notifyDataSetChanged / Invalidated ()

Aqui está o código em questão:

private Runnable filterDrugListRunnable = new Runnable() {
    public void run() {
        if (filterLock.tryLock() == false) return;

        cur = ActivityUtils.getIndexItemCursor(DrugListActivity.this);

        if (cur == null || forceRefresh == true) {
            cur = docDb.getItemCursor(selectedIndex.getIndexId(), filter);
            ActivityUtils.setIndexItemCursor(DrugListActivity.this, cur);
            forceRefresh = false;
        }

        updateHandler.post(new Runnable() {
           public void run() {
               listAdapter.changeCursor(cur);
           }
        });

        filterLock.unlock();

        updateHandler.post(hideProgressRunnable);
        updateHandler.post(updateListRunnable);
    }
};
Publicado 27/08/2009 em 00:16
fonte usuário
Em outras línguas...                            


2 respostas

votos
1

Acho que é difícil acreditar que listAdapter.changeCursor()só iria ocupar o tempo suficiente para causar uma ANR, supondo que você criou o Cursorem uma discussão de fundo. Há apenas não deve ser muito trabalho que precisa acontecer para pintar um punhado de linhas da lista. Eu verifique para ver o trabalho que você está fazendo em seu Handler é tão limitada quanto você pensa. Talvez considere usar um AsyncTask, o que torna mais fácil para separar o trabalho de fundo ( doInBackground()) a partir do pós-processamento on-UI-thread ( onPostExecute()).

Você pode tentar apenas substituindo o adaptador diretamente, chamando setAdapter()novamente com o novo Cursorenvolto em um novo adaptador.

Você pode olhar para ver como AutoCompleteTextViewlida com esse cenário, uma vez que ele faz on-the-fly filtragem com um SpinnerAdapter. Talvez algumas de suas técnicas pode aplicar no seu caso.

Respondeu 27/08/2009 em 10:57
fonte usuário

votos
0

Só postou uma resposta aqui: atualizar dados Listview após cargas de Tópicos da rede: Android

Curto: de AsyncTask método onProgressUpdate pode tocar o ponto de vista: http://developer.android.com/reference/android/os/AsyncTask.html#onProgressUpdate (Progress ...)

Respondeu 15/06/2010 em 06:57
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more