Android 从另一个线程的JSON填充ListView
所以, 我从REST服务器得到一个JSON,我想用它的信息填充一个ListView。我得到的是:Android 从另一个线程的JSON填充ListView,android,android-listview,Android,Android Listview,所以, 我从REST服务器得到一个JSON,我想用它的信息填充一个ListView。我得到的是: public class MyReservations extends ListActivity { .... class HTTPAssync implements Runnable { public void run () { ... //make the requestions and get a valida JSONObject (that h
public class MyReservations extends ListActivity {
....
class HTTPAssync implements Runnable {
public void run () {
... //make the requestions and get a valida JSONObject (that has a JSONArray)
try {
JSONObject jsonObject = new JSONObject(payload);
reservs = jsonObject.getJSONArray("reservs");
try {
listView.setAdapter(new JSONAdapter(MyReservations.this, reservs));
}
我还创建了一个JSONAdapter:
class JSONAdapter extends BaseAdapter implements ListAdapter {
private final Activity activity;
private final JSONArray jsonArray;
private LayoutInflater mInflater;
public JSONAdapter(Activity activity, JSONArray jsonArray) {
assert activity != null;
assert jsonArray != null;
this.jsonArray = jsonArray;
this.activity = activity;
}
public int getCount() {
return jsonArray.length();
}
public JSONObject getItem(int position) {
return jsonArray.optJSONObject(position);
}
public long getItemId(int position) {
JSONObject jsonObject = getItem(position);
return jsonObject.optLong("id");
}
public View getView(int position, View view, ViewGroup parent) {
if (view == null)
view = activity.getLayoutInflater().inflate(R.layout.reservation, null);
JSONObject jsonObject = getItem(position);
view = mInflater.inflate(R.layout.reservation, null);
((TextView) view.findViewById(R.id.reservationCourse)).setText("MOTHAFOCKA");
return view;
}
}
但是当我创建
新线程(newhttpassync()).start()时
Im获取android.view.ViewRootImpl$calledFromErrorThreadException:只有创建视图层次结构的原始线程才能接触其视图。
。我试图创建一个方法并从中设置适配器,但得到了相同的错误。我该怎么做呢?这不是JSON的问题。你必须使用。处理程序有两种主要用途:
(1)将消息和可运行程序安排为将来某个时间点执行
(2)将要在不同线程上执行的操作排队
例如:
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
final Object obj = msg.obj;
switch (msg.what) {
case MODE_DELETE:
this.post(new Runnable() {
public void run() {
performDelete();
}
});
break;
case ON_SERVICE_STATUS_CHAGED:
((LauncherUI)mContext).updateUI();
break;
case ON_DISPLAY_TOAST:
Toast.makeText(mContext, obj.toString(),Toast.LENGTH_SHORT).show();
break;
case GET_USER_INPUT:
handleUserInputRequest();
break;
// ....
default:
super.handleMessage(msg);
}
}
};
下面是一个呼叫示例:
mHandler.sendMessage(mHandler.obtainMessage(ON_DISPLAY_TOAST, "show toast"));
谢谢,我以前用过
手柄
,但没想到它会适合这种情况。