Android CursorAdapters, ListViews a pozadí závity

hlasů
2

Tato aplikace Pracoval jsem na má databází s několika megabajtů dat probírat. Mnoho aktivit právě ListViews sestupně prostřednictvím různých úrovní dat v rámci databází, až se dostaneme „dokumenty“, který je právě HTML, které mají být vytažen z DB (ů) a na displeji telefonu. Problematika Mám je, že některé z těchto aktivit je třeba mít možnost vyhledávat v databázích tím, že zachytí úhozů a re-running dotaz s „jako% bla%“ v něm. To funguje poměrně rychle, vyjma případů, kdy je uživatel nejprve načítá data i když uživatel poprvé vstoupí stisknutí klávesy. Já používám ResourceCursorAdapter a já generování kurzor do pozadí nit, ale s cílem provést listAdapter.changeCursor (), musím použít Handler přidání do hlavního uživatelského rozhraní závitu. Tento konkrétní hovor je pak zmrazení UI vlákno jen na tak dlouho , aby se obávané dialog ANR. Jsem zvědavý, jak mohu zbavit toto pozadí nit zcela takže uživatelské rozhraní zůstává citlivý a nemáme ANR dialogy vyskakování.

Jen pro úplné zveřejnění, jsem byl původně vrací ArrayList vlastního modelu objektů a pomocí ArrayAdapter, ale (pochopitelně) zákazník poukázal na to byla špatná paměť manangement a nebyl jsem spokojený s výkonem kdekoli. Já bych opravdu rád, aby se zabránilo řešení, kde jsem generování obrovské seznamy objektů a pak dělá listAdapter.notifyDataSetChanged / zneplatnit ()

Zde je kód v otázce:

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);
    }
};
Položena 27/08/2009 v 00:16
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
1

Připadá mi to těžké uvěřit, že listAdapter.changeCursor()by samy o sobě zabírají dostatek času způsobit ANR, za předpokladu, že vytvoří Cursorv pozadí nit. Tam prostě by nemělo být tak mnoho práce, která se musí stát, aby překreslit hrst seznam řádků. Já bych double-zkontrolujte, jakou práci děláte ve svém Handler je maximálně omezena, jak si myslíte. Třeba zvážit použití AsyncTask, který usnadňuje oddělit práci na pozadí ( doInBackground()) z post-processing on-UI-nití ( onPostExecute()).

Můžete zkusit jen výměnou adaptéru úplně, voláním setAdapter()opět s novým Cursorzabalené do nového adaptéru.

Můžete se podívat, jak se AutoCompleteTextViewzpracovává tento scénář, protože to dělá on-the-fly filtrování s SpinnerAdapter. Možná, že někteří z jeho technik lze použít ve vašem případě.

Odpovězeno 27/08/2009 v 10:57
zdroj uživatelem

hlasů
0

Jen vyslán odpověď zde: Android: Aktualizace Listview po Thread zatížení dat ze sítě

Zkrátka: AsyncTask metoda onProgressUpdate může dotknout názor: http://developer.android.com/reference/android/os/AsyncTask.html#onProgressUpdate (Progress ...)

Odpovězeno 15/06/2010 v 06:57
zdroj uživatelem

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