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