2017-12-16 11 views
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는 그걸 어떻게 처리해야합니까?

+0

당신은 다른 스레드에서 UI를 변경할 수 없습니다 수행하여 문제를 해결! 'onResponse'를 두는 것이 효과가 있습니까? – Xenolion

+0

예, 퍼팅 작업을해도 걱정하지 않아요. 고마워요. –

+0

오케이 ** 해피 코딩! **. – Xenolion

답변

0

난 그냥이

getActivity().runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         adapter.notifyDataSetChanged(); 
        } 
       }); 
관련 문제