0

내 logcat에 다음과 같이 표시됩니다. skipped X frames! The application may be doing too much work on its main thread 여기서 X는 일반적으로 40 ~ 60입니다.Volley 응답 수신기에서 for 루프를 실행하고 있습니까?

저는 Android 개발을 처음 접했고 Volley가 AsyncTasks에서 얼마나 많은 일을하는지 확신 할 수 없습니다. 내 단편에서 I는 같은 JSON위한 서버에 요청을 발송

{ "networks" : [ { "name" : "a name", "external_id" : "an external_id" }, ... ] } 

... 나가 어레이에서 보여준 제 것과 같은 형태적인 요소에 대한 홀더 일 뿐이다.

기본적으로 내 조각에있는 onActivityCreated 함수의 모든 작업을 수행합니다.

여기 코드가 있는데 내가 잘못하고 있는지 확실하지 않습니다. 또한 for 루프의 요점은 JSONArray를 순환하여 각 요소를 자체 모델로 변환 한 다음 ArrayList에 전달하여 궁극적으로 어댑터를 통해 UI에 맞게 조정하는 것입니다.

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    mSessionPreferences = this.getActivity().getSharedPreferences(
      getString(R.string.session_shared_preferences_key), Context.MODE_PRIVATE); 

    networks = getListView(); 

    networkItems = new ArrayList<Network>(); 
    listAdapter = new NetworksListAdapter(getActivity(), networkItems); 
    networks.setAdapter(listAdapter); 

    JSONObject params = new JSONObject(); 
    params.put("user_id", mSessionPreferences.getString(getString(R.string.user_id_key), null)) 
      .put("auth_token", mSessionPreferences.getString(getString(R.string.user_auth_token_key), null)); 

    Response.Listener<JSONObject> listener = new Response.Listener<JSONObject>() { 
     @Override 
     public void onResponse(JSONObject response) { 
      JSONArray jsonNetworks = response.optJSONArray("networks"); 
      int len = jsonNetworks.length(); 
      for (int i = 0; i < len; i++) { 
       JSONObject jsonNetwork = jsonNetworks.optJSONObject(i); 
       Network network = new Network(jsonNetwork.optString("external_id"), 
          jsonNetwork.optString("name"); 

       networkItems.add(network); 
      } 

      listAdapter.notifyDataSetChanged(); 
     } 
    }; 

    Response.ErrorListener errorListener = new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      VolleyErrorHandler volleyError = new VolleyErrorHandler(error); 

      Log.v("Sigh", volleyError.getMessage(), "nope")); 
     } 
    }; 

    APIRequestManager.getInstance().doRequest().getNetworks(params, listener, errorListener); 
} 

마지막 줄이 발리에게 요청을 보내는 것을 처리합니다.

의심스러운 항목이 있습니까? 참고, 이것은 에뮬레이터가 아니며, 실제 장치에 있습니다. 나는 그것이 비동기 물건을 처리한다는 인상하에 있었다. 백그라운드에서 청취자와 함께 일을해야합니까? 그렇다면 어떻게해야합니까?

+0

실제로 발리는 백그라운드에서 작업 부하를 처리합니다. 그러나 리스너는 UI 스레드에서 기본적으로 실행됩니다. 이는 사용자의 책임입니다. 프레임을 건너 뛰는 경우 UI 스레드에서 수행되는 일종의 긴 작업입니다. 유익한 로그 인쇄를 두어 해당 작업의 위치를 ​​정확히 찾아서이를 백그라운드 스레드로 이동하십시오. –

답변

0

jsonNetworks의 길이가 긴 경우 백그라운드에서이 메소드를 실행해야합니다. 시도해보십시오.

@Override 
public void onResponse(JSONObject response) { 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      JSONArray jsonNetworks = response.optJSONArray("networks"); 
      int len = jsonNetworks.length(); 
      for (int i = 0; i < len; i++) { 
       JSONObject jsonNetwork = jsonNetworks.optJSONObject(i); 
       Network network = new Network(jsonNetwork.optString("external_id"), 
         jsonNetwork.optString("name"); 

       networkItems.add(network); 
      } 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        listAdapter.notifyDataSetChanged(); 
       } 
      }); 
     } 
    }).start(); 
} 
+0

이 개념은 옳은 것 같지만 작동해야하지만 코드가 맞다고 생각하지 않습니다. – David

+0

좋아요, 그래서 저는'runOnUiThread'가'getActivity(). runOnUiThread'가되어야한다는 단서를 없앴습니다. 유일한 다른 문제는'response'를 참조하고 최종 변수가 아니라는 것입니다. – David

+0

해결되었습니다. 'new Thread (new Runnable() {', 그냥 마지막 JSONObject jsonResponse = response;를 작성하고 jsonResponse로 대체 응답) – David

관련 문제