gpt4 book ai didi

android - 处理程序不会绑定(bind)到主线程

转载 作者:行者123 更新时间:2023-11-29 22:22:27 24 4
gpt4 key购买 nike

所以我的代码在遇到这一行之前似乎运行得很好

adapter.notifyDataSetChanged();

logcat中弹出的错误是CalledFromWrongThreadException。调试还显示正在后台线程中运行的处理程序。如何让处理程序绑定(bind)到主线程,而不是后台线程?我以为我只需要在主线程中创建处理程序,但我想我错了,很可能我是 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;
}
}

最佳答案

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

我不知道为什么这会导致您看到的错误,但这是我在使用处理程序和线程而不是 AsyncTask 时设置它的方式。而且我从来没有见过这样的错误。

@Nguyen 是对的,尽管 AsyncTask 是现在处理这类事情的首选方式。它实际上让事情变得更容易。

AsyncTask docs

AsyncTask Example

关于android - 处理程序不会绑定(bind)到主线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6792949/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com