2010-05-03 57 views
0

我試圖讓這段代碼運行,但是當我運行這段代碼時,我得到一個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(); 
    } 
} 

回答

0

在android應用程序中使用Thread是不是好主意。嘗試使用AsyncTask提供更便捷的方式來使用後臺任務

+0

失敗。使用線程是一個好主意,並且在很多情況下是必要的,這樣您就不會阻塞UI線程並導致ANR。 – 2010-05-03 11:50:36

+0

'AsyncTask'封裝了一個管理的後臺線程池。在AsyncTask之外分叉自己的線程有時是必要的,但爲了簡單起見,最好避免使用。我相信Goth先生指的是使用'Thread'對象。 – CommonsWare 2010-05-03 12:57:43

+0

當然,我的意思是線程對象 – WarGoth 2010-05-03 13:16:25

2

我不知道什麼是物品。如果項目爲ArrayAdapter,則無法從後臺線程安全地修改ArrayAdapter的內容(無論您是分叉線程還是AsyncTask)。

0

正如我在另一個線程中所說:我有同樣的問題,我解決了它。我的問題是我正在使用一個列表視圖,一個數組適配器和過濾器。在方法performFiltering我搞亂有數據的數組,因爲這個方法沒有在UI線程和EVENTUALLY上運行,所以引發了一些問題。

相關問題