Android 处理程序不会绑定到主线程

Android 处理程序不会绑定到主线程,android,multithreading,handler,Android,Multithreading,Handler,所以我的代码似乎运行得很好,直到它达到这一行 adapter.notifyDataSetChanged(); logcat中弹出的错误称为FromErrorThreadException。调试还显示正在后台线程中运行的处理程序。如何让处理程序绑定到主线程而不是后台线程?我以为我只需要在主线程中创建处理程序,但我想我错了,很可能我是andriod的新手。我该如何解决这个问题 //Imports are included public class DirectoryActivity extends

所以我的代码似乎运行得很好,直到它达到这一行

adapter.notifyDataSetChanged();
logcat中弹出的错误称为FromErrorThreadException。调试还显示正在后台线程中运行的处理程序。如何让处理程序绑定到主线程而不是后台线程?我以为我只需要在主线程中创建处理程序,但我想我错了,很可能我是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;
    }
}
//包括导入
公共类DirectoryActivity扩展了ListActivity{
private ProgressDialog ProgressDialog=null;
private ArrayList listing=null;
专用目录适配器;
私人可运行视图命令;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.directory);
最终处理程序=新处理程序(){
@凌驾
公共无效handleMessage(消息消息消息){
if(listing!=null&&listing.size()>0){
adapter.notifyDataSetChanged();
对于(int i=0;i

}根据我的经验,您应该创建自己的类来扩展AsyncTask类,以便在后台执行某些操作。这比使用线程+处理程序更简单、更有效。

尝试调用
handler.sendEmptyMessage(0)
而不是
handler.handleMessage(null)

我不知道为什么这会导致您看到的错误,但当我使用处理程序和线程而不是AsyncTask时,我就是这样设置的。我从未见过这样的错误

@Nguyen是对的,尽管AsyncTask现在是处理这类事情的首选方式。事实上,这样做更容易


我尝试让AsyncTask工作,但遇到了相同类型的问题。我想我会在等待其他人是否能提供帮助时再试一次。不幸的是,我找不到该版本的备份,所以我不能说。很好,这阻止了它崩溃,谢谢!现在我必须弄清楚为什么我什么都没看到。