在Volley响应侦听器中运行for循环是否正常



我在我的logcat中得到了这个:skipped X frames! The application may be doing too much work on its main thread,其中X通常在40到60之间。

我是android开发的新手,我不确定Volley在AsyncTasks方面做了多少工作。在我的片段中,我向服务器发送了一个JSON请求,如下所示:

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

...只是与我在数组中显示的第一个元素形式相同的元素的占位符。

我在Fragment中的onActivityCreated函数中基本上完成了所有的工作。

这是代码,我不确定我是否做错了什么。此外,for循环的要点是通过JSONArray进行循环,并将每个元素转化为自己的模型,然后我将其传递给ArrayList,ArrayList最终通过Adapter适应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);
}

最后一行负责让Volley发送请求。

有什么可疑的东西吗?注意,这不是在模拟器上,而是在我的实际设备上。我的印象是它处理异步的东西。我应该明确地在后台与听众一起做事吗?如果是,我该怎么做?

如果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();
}

最新更新