我試圖讓這段代碼運行,但是當我運行這段代碼時,我得到一個IllegalStateException,說沒有通知listview的內容,但是我有更新數據的通知。這是一個自定義列表視圖適配器。這裏是我的代碼的相關部分:如何解決嘗試更新列表視圖時出現的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();
}
}
失敗。使用線程是一個好主意,並且在很多情況下是必要的,這樣您就不會阻塞UI線程並導致ANR。 – 2010-05-03 11:50:36
'AsyncTask'封裝了一個管理的後臺線程池。在AsyncTask之外分叉自己的線程有時是必要的,但爲了簡單起見,最好避免使用。我相信Goth先生指的是使用'Thread'對象。 – CommonsWare 2010-05-03 12:57:43
當然,我的意思是線程對象 – WarGoth 2010-05-03 13:16:25