尝试更新列表视图时如何修复IllegalStateException错误?

时间:2010-05-03 04:34:03

标签: java android

我正在尝试运行此代码,但是当我运行此代码时,我收到了IllegalStateException,表示未通知listview的内容,但我在更新数据时收到通知。这是一个自定义列表视图适配器。这是我的代码的相关部分:

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 个答案:

答案 0 :(得分:2)

我不知道是什么物品。如果项目是ArrayAdapter,则无法从后台线程安全地修改ArrayAdapter的内容(无论是您分叉的线程还是AsyncTask)。

答案 1 :(得分:0)

在Android应用中使用Thread并不是一个好主意。尝试使用AsyncTask,它提供了更方便的后台任务使用方法

答案 2 :(得分:0)

正如我在另一个帖子中所说:我有同样的问题,我解决了它。我的问题是我使用的是listview,带有数组适配器和过滤器。在方法performFiltering我弄乱了有数据的数组,这是问题,因为这个方法没有在UI线程上运行,并且偶然会引起一些问题。