내 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);
}
마지막 줄이 발리에게 요청을 보내는 것을 처리합니다.
의심스러운 항목이 있습니까? 참고, 이것은 에뮬레이터가 아니며, 실제 장치에 있습니다. 나는 그것이 비동기 물건을 처리한다는 인상하에 있었다. 백그라운드에서 청취자와 함께 일을해야합니까? 그렇다면 어떻게해야합니까?
실제로 발리는 백그라운드에서 작업 부하를 처리합니다. 그러나 리스너는 UI 스레드에서 기본적으로 실행됩니다. 이는 사용자의 책임입니다. 프레임을 건너 뛰는 경우 UI 스레드에서 수행되는 일종의 긴 작업입니다. 유익한 로그 인쇄를 두어 해당 작업의 위치를 정확히 찾아서이를 백그라운드 스레드로 이동하십시오. –