2011-07-22 51 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

相关问题