0
저는 발리를 사용하여 서버에 게시하고 응답을받습니다. 일부 데이터를 게시하고 다른 데이터를 가져 와서 listview
에 가져옵니다. 내가 adapter.notifyDataSetChanged();
여기adapter.notifyDataSetChanged 뷰 계층 구조를 만든 원래 스레드 만 해당 뷰를 만질 수 있습니다.
E/Volley: [1945] NetworkDispatcher.processRequest: Unhandled exception android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:7802)
at android.view.ViewRootImpl.focusableViewAvailable(ViewRootImpl.java:3622)
at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:760)
at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:760)
at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:760)
at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:760)
at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:760)
at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:760)
at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:760)
at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:760)
at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:760)
at android.view.View.setFlags(View.java:12529)
at android.view.View.setFocusableInTouchMode(View.java:8688)
at android.widget.AdapterView.checkFocus(AdapterView.java:1122)
at android.widget.AdapterView$AdapterDataSetObserver.onChanged(AdapterView.java:1217)
at android.widget.AbsListView$AdapterDataSetObserver.onChanged(AbsListView.java:9487)
at android.database.DataSetObservable.notifyChanged(DataSetObservable.java:37)
at android.widget.BaseAdapter.notifyDataSetChanged(BaseAdapter.java:50)
at com.example.junaida.project1.fragments.CardFragment$3.parseNetworkResponse(CardFragment.java:179)
at com.android.volley.NetworkDispatcher.processRequest(NetworkDispatcher.java:132)
at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:87)
E/VOLLEY: com.android.volley.VolleyError: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
를 가리키는, 그것은이 오류 메시지를 표시 응용 프로그램을 실행할 때 내 문제가 나의 코드
try {
RequestQueue requestQueue = Volley.newRequestQueue(getContext());
String URL = "http://192.168.0.105/WebApplication7/api/subjects";
JSONObject jsonBody = new JSONObject();
// jsonBody.put("tblRegisteredUsers_nickName", username.getText().toString().trim());
jsonBody.put("id", "2016");
jsonBody.put("Type", "1");
jsonBody.put("Year","1");
final String requestBody = jsonBody.toString();
StringRequest stringRequest = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
if (response.equals("success")) {
//login authenticated. Start the next activity of your app
Toast.makeText(getActivity(), response.toString(), Toast.LENGTH_LONG).show();
// Toast.makeText(getApplicationContext(), "registered successfully ", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(getActivity(), MainActivity.class);
// intent.putExtra("id", Id);
// intent.putExtra("year", year);
startActivity(intent);
} else {
//login failed. prompt to re-enter the credentials
Toast.makeText(mActivity.getApplicationContext(), "Failed to log In", Toast.LENGTH_SHORT).show();
Log.i("VOLLEY", response);
Toast.makeText (mActivity.getApplicationContext(), response.toString(), Toast.LENGTH_LONG).show();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("VOLLEY", error.toString());
}
})
{
@Override
public String getBodyContentType() {
return "application/json; charset=utf-8";
}
@Override
public byte[] getBody() throws AuthFailureError {
try {
return requestBody == null ? null : requestBody.getBytes("utf-8");
} catch (UnsupportedEncodingException uee) {
VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s", requestBody, "utf-8");
return null;
}
}
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
String responseString;
String json = null;
try {
json = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
responseString = String.valueOf(json).trim();
ArrayList<Response4> list_response = new ArrayList<Response4>();
Type listType = new TypeToken<List<Response4>>() {}.getType();
list_response = new Gson().fromJson(responseString, listType);
//String check = list.get(0).getMessagesName();
for (int i = 0;i<list_response.size();i++) {
// JSONObject obj = response.getJSONObject(i);
ListItemsData listItemData = new ListItemsData();
listItemData.setItem(list_response.get(i).getMessagesName());
listItemData.setUrl(list_response.get(i).getMessageURLNew());
//listItemData.setUrl((obj.getString("url")));
list.add(listItemData);
//Id = list.get(0).getId();
// year = list.get(0).getYear();
//Response2 yourModel = new Gson().fromJson(responseString, Response2.class);
}
adapter.notifyDataSetChanged();
// String Check = yourModel.getMessagetitle();
return Response.success(list_response.toString(), HttpHeaderParser.parseCacheHeaders(response));
}
};
requestQueue.add(stringRequest);
} catch (JSONException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return rootView;
}
그래서 adapter.notifyDataSetChanged();
을 가리키는가 위의 오류를 출력 코드를 실행하면 Adpater는 그걸 어떻게 처리해야합니까?
당신은 다른 스레드에서 UI를 변경할 수 없습니다 수행하여 문제를 해결! 'onResponse'를 두는 것이 효과가 있습니까? – Xenolion
예, 퍼팅 작업을해도 걱정하지 않아요. 고마워요. –
오케이 ** 해피 코딩! **. – Xenolion