2017-12-16 13 views
0

Ich benutze volley, um zu posten und eine Antwort vom Server zu erhalten. Ich poste einige Daten und bekomme einige andere Daten und hole sie in eine listview. Mein Problem ist, wenn ich die App fordert es diesen Fehler führen, indem er auf adapter.notifyDataSetChanged();adapter.notifyDataSetChanged Nur der ursprüngliche Thread, der eine Ansichtshierarchie erstellt hat, kann seine Ansichten berühren

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. 

hier ist mein Code

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; 
    } 

Wenn ich führen Sie den Code es die obige Fehler druckt zeigt, auf adapter.notifyDataSetChanged(); so was hat der adapter damit zu tun?

+0

Sie nicht die Benutzeroberfläche von anderen Threads ändern können! Funktioniert das Aufsetzen von onResponse? – Xenolion

+0

yea putting funktioniert, mach dir keine Sorgen ich gerade gelöst danke –

+0

Okay ** Happy Coding! **. – Xenolion

Antwort

0

i gelöst gerade das Problem, indem diese

getActivity().runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         adapter.notifyDataSetChanged(); 
        } 
       }); 
tun
Verwandte Themen