Как исправить ошибку IllegalStateException при попытке обновления списка? - PullRequest
0 голосов
/ 03 мая 2010

Я пытаюсь заставить этот код работать, но я получаю IllegalStateException, когда я запускаю этот код, говоря, что содержимое списка не было уведомлено, но у меня есть уведомление после обновления данных. Это настраиваемый адаптер списка. Вот соответствующая часть моего кода:

class LoadingThread extends Thread {
    public void run() {
        int itemsOriginallyLoaded = 0;
        synchronized( items ) {
            itemsOriginallyLoaded = items.size();
        }
        for( int i = itemsOriginallyLoaded ; i < itemsToLoad ; ++i ) {
            Log.d( LOG_TAG, "Loading item #"+i );
            //String item = "FAIL";
            //try {
            String item = "FAIL";
            try {
                item = stockGrabber.getStockString(dataSource.get(i));
            } catch (ApiException e) {
                Log.e(LOG_TAG, "Problem making API request", e);
            } catch (ParseException e) {
                Log.e(LOG_TAG, "Problem parsing API request", e);
            }
            //} catch (ApiException e) {
            //  Log.e(TAG, "Problem making API request", e);
            //} catch (ParseException e) {
            //  Log.e(TAG, "Problem parsing API request", e);
            //}
            synchronized( items ) {
                items.add( item );
            }
            itemsLoaded = i+1;
            uiHandler.post( updateTask );
            Log.d( LOG_TAG, "Published item #"+i );
        }
        if( itemsLoaded >= ( dataSource.size() - 1 ) )
            allItemsLoaded = true;
        synchronized( loading ) {
            loading = Boolean.FALSE;
        }
    }
}

class UIUpdateTask implements Runnable {
    public void run() {
        Log.d( LOG_TAG, "Publishing progress" );
        notifyDataSetChanged();
    }
}

Ответы [ 3 ]

2 голосов
/ 03 мая 2010

Я не знаю, что это за предметы. Если элементы имеют значение ArrayAdapter, вы не можете безопасно изменять содержимое ArrayAdapter из фонового потока (независимо от того, какой поток вы используете или AsyncTask).

0 голосов
/ 09 марта 2011

как я сказал в другой ветке: у меня была такая же проблема, и я решил ее. Моя проблема заключалась в том, что я использовал просмотр списка, с адаптером массива и с фильтром. В методе executeFiltering я возился с массивом, в котором есть данные, и это было проблемой, так как этот метод не работает в потоке пользовательского интерфейса и в конечном итоге он вызывает некоторые проблемы.

0 голосов
/ 03 мая 2010

Использование Thread s в приложениях для Android не очень хорошая идея. Попробуйте использовать AsyncTask, который предоставляет более удобный способ использовать фоновые задачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...