2011-07-22 58 views
1

所以我的代碼似乎直到碰到這條線處理程序不會綁定到主線程

adapter.notifyDataSetChanged(); 

,在logcat中彈出的錯誤是CalledFromWrongThreadException跑就好了。調試還顯示在後臺線程中運行的處理程序。我如何讓處理程序綁定到主線程,而不是後臺?我以爲我只是在主線程中創建處理程序,但我想我錯了,很可能我對andriod很陌生。我該如何解決?

//Imports are included 
public class DirectoryActivity extends ListActivity { 
    private ProgressDialog ProgressDialog = null; 
    private ArrayList<DirectoryListing> listing = null; 
    private DirectoryAdapter adapter; 
    private Runnable viewOrders; 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.directory); 
    final Handler handler = new Handler() { 

     @Override 
     public void handleMessage(Message msg) { 


      if (listing != null && listing.size() > 0) { 
       adapter.notifyDataSetChanged(); 
       for (int i = 0; i < listing.size(); i++) 
        adapter.add(listing.get(i)); 
       Log.e("log_tag", "\nStill running\n"); 
      } 
      ProgressDialog.dismiss(); 
      adapter.notifyDataSetChanged(); 

     } 

    }; 
    listing = new ArrayList<DirectoryListing>(); 
    adapter = new DirectoryAdapter(this, R.layout.rows, listing); 
    setListAdapter(adapter); 
    ProgressDialog = ProgressDialog.show(DirectoryActivity.this, "Please wait...", "Retrieving data ...", true); 
    viewOrders = new Runnable() { 
     @Override 
     public void run() { 
      listing = PreparePage.getArrayList(); 
      handler.handleMessage(null); 
     } 
    }; 
    Thread thread = new Thread(null, viewOrders, "Background"); 
    thread.start(); 




} 


private static class PreparePage { 
    protected static ArrayList<DirectoryListing> getArrayList() { 

     ArrayList<DirectoryListing> listings = new ArrayList<DirectoryListing>(); 
     JSONObject information = GetPageData.getJSONFromURL(url); 
     Iterator key = information.keys(); 

     while (key.hasNext()) { 
      String id = (String) key.next(); 
      JSONObject info = null; 
      try { 
       info = information.getJSONObject(id); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      String name = "", title = "", photo = ""; 
      try { 
       name = info.get("firstName") + " " + info.get("lastName"); 
       title = info.getJSONObject("position").getString("name"); 
       photo = info.optString("photoPath", "none"); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      listings.add(new DirectoryListing(name, title, photo)); 

     } 
     return listings; 
    } 
} 

}

回答

1

嘗試調用的handler.sendEmptyMessage(0);代替handler.handleMessage(null);

我不知道爲什麼會導致您所看到的錯誤,但是這是我有它設置,當我使用的處理程序,而是線程的AsyncTask的。我從來沒有看到過這樣做的錯誤。

@Nguyen是對的,雖然AsyncTask是現在處理這些類型的東西的首選方式。這實際上使得它更容易做到。

AsyncTask docs

AsyncTask Example

+0

改變了這一點,使它不會中斷,謝謝!現在我只需要弄清楚爲什麼我什麼都看不到。 – Collecter

1

以我的經驗,你應該創建自己的類,它擴展的AsyncTask類做的背景是什麼。這比使用線程+處理程序更簡單,更有效。

+0

我試圖得到的AsyncTask的工作,但遇到同樣類型的問題。我想我會再次嘗試,看看是否有其他人可以幫忙。 – Collecter

+0

當你使用AsyncTask時,你的代碼如何? –

+0

我不幸找不到該版本的備份,所以我不能說。 – Collecter

相關問題