CursorAdapters Applications, listviews et fils de fond

voix
2

Cette application, je travaille sur des bases de données a avec plusieurs méga-octets de données à éplucher. Beaucoup des activités sont tout simplement listviews descendant à travers différents niveaux de données dans les bases de données jusqu'à ce que nous atteignons les « documents », qui est juste HTML pour être tiré de la DB (s) et affiché sur le téléphone. La question que j'ai est que certaines de ces activités doivent avoir la possibilité de rechercher dans les bases de données en capturant les frappes et ré-exécution de la requête avec un « comme% bla% » en elle. Cela fonctionne assez rapidement, sauf lorsque l'utilisateur est d'abord le chargement des données et lorsque l'utilisateur entre d'abord dans une combinaison de touches. J'utilise un ResourceCursorAdapter et je générer le curseur dans un thread d'arrière-plan, mais pour faire un listAdapter.changeCursor (), je dois utiliser un gestionnaire pour l'afficher au principal thread d'interface utilisateur.juste assez longtemps pour faire apparaître la boîte de dialogue ANR redoutée. Je suis curieux de savoir comment je peux décharger à un fil d'arrière - plan totalement si l'interface utilisateur reste réactif et nous n'avons pas les boîtes de dialogue ANR apparaître.

Juste pour la divulgation complète, je rentrais à l'origine d'un ArrayList d'objets de modèle personnalisé et en utilisant un ArrayAdapter, mais (naturellement) le client fait remarquer qu'il était mauvaise mémoire manangement et je n'étais pas satisfait de la performance de toute façon. Je voudrais vraiment éviter une solution où je générer des listes énormes d'objets et de faire ensuite un listAdapter.notifyDataSetChanged / Invalidated ()

Voici le code en question:

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);
    }
};
Créé 27/08/2009 à 00:16
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
1

Je trouve qu'il est difficile de croire que listAdapter.changeCursor()seuls prendrait le temps suffisant pour provoquer une ANR, en supposant créé le Cursordans un thread d'arrière - plan. Il ne devrait tout simplement pas que beaucoup de travail qui doit arriver à repeindre une poignée de lignes de la liste. Je revérifier pour voir ce travail que vous faites dans votre gestionnaire est aussi limité que vous pensez. Peut-être envisager l' utilisation d' un AsyncTask, ce qui le rend plus facile de séparer le travail de fond ( doInBackground()) du post-traitement-fil sur l' interface utilisateur ( onPostExecute()).

Vous pouvez simplement remplacer l'adaptateur pur et simple, en appelant à setAdapter()nouveau avec le nouveau Cursorenveloppé dans un nouvel adaptateur.

Vous pouvez regarder pour voir comment AutoCompleteTextViewgère ce scénario, car il fait sur la volée avec un filtrage SpinnerAdapter. Peut-être que certaines de ses techniques peuvent appliquer dans votre cas.

Créé 27/08/2009 à 10:57
source utilisateur

Créé 15/06/2010 à 06:57
source utilisateur

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