Java 当尝试更新listview时,如何修复IllegalStateException错误?

Java 当尝试更新listview时,如何修复IllegalStateException错误?,java,android,Java,Android,我正在尝试运行此代码,但是当我运行此代码时,我得到一个IllegalStateException,表示没有通知listview的内容,但在更新数据时我收到了一个通知。这是一个自定义listview适配器。以下是我的代码的相关部分: class LoadingThread extends Thread { public void run() { int itemsOriginallyLoaded = 0; synchronized( items ) {

我正在尝试运行此代码,但是当我运行此代码时,我得到一个IllegalStateException,表示没有通知listview的内容,但在更新数据时我收到了一个通知。这是一个自定义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();
    }
}
类装入线程扩展线程{
公开募捐{
int itemsororiginalloladed=0;
已同步(项目){
itemsOriginallyLoaded=items.size();
}
对于(int i=itemsOriginallyLoaded;i=(dataSource.size()-1))
allItemsLoaded=真;
同步(加载){
加载=Boolean.FALSE;
}
}
}
类UIUpdateTask实现可运行{
公开募捐{
Log.d(Log_标签,“发布进度”);
notifyDataSetChanged();
}
}

在android应用程序中使用
线程
s不是个好主意。尝试使用AsyncTask,它提供了更方便的方式来使用后台任务

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

正如我在另一个线程中所说:我遇到了相同的问题,并且解决了它。我的问题是,我使用的是一个listview、一个阵列适配器和一个过滤器。关于performFiltering方法,我搞乱了包含数据的数组,这就是问题所在,因为该方法没有在UI线程上运行,最终会引发一些问题。

失败。使用线程是一个好主意,在许多情况下是必要的,这样您就不会阻塞UI线程并导致ANR。
AsyncTask
包装后台线程的托管池。在
AsyncTask
之外分叉自己的线程有时是必要的,但为了简单起见,最好避免这样做。我相信哥特先生指的是
Thread
对象的使用。