Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在截击响应侦听器中运行for循环可以吗?_Java_Android_Android Fragments_Android Asynctask_Android Volley - Fatal编程技术网

Java 在截击响应侦听器中运行for循环可以吗?

Java 在截击响应侦听器中运行for循环可以吗?,java,android,android-fragments,android-asynctask,android-volley,Java,Android,Android Fragments,Android Asynctask,Android Volley,我在日志中看到了这一点:跳过了X帧!应用程序可能在其主线程上做了太多工作,其中X通常在40到60之间 我是android开发的新手,我不确定截击对异步任务的影响有多大。在我的片段中,我向服务器发送了一个JSON请求,如下所示: { "networks" : [ { "name" : "a name", "external_id" : "an external_id" }, ... ] } …只是数组中第一个元素形式相同的元素的占位符 我在片段中的onActivityCreated函数中基本上完

我在日志中看到了这一点:
跳过了X帧!应用程序可能在其主线程上做了太多工作
,其中X通常在40到60之间

我是android开发的新手,我不确定截击对异步任务的影响有多大。在我的片段中,我向服务器发送了一个JSON请求,如下所示:

{ "networks" : [ { "name" : "a name", "external_id" : "an external_id" }, ... ] }
只是数组中第一个元素形式相同的元素的占位符

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

这是代码,我不确定我是否做错了什么。此外,for循环的要点是通过JSONArray进行循环,并将每个元素转换为其自己的模型,然后将其传递给ArrayList,该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);
}
@覆盖
已创建ActivityState上的公共无效(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
mSessionPreferences=this.getActivity().getSharedReferences(
getString(R.string.session\u shared\u preferences\u key)、Context.MODE\u PRIVATE);
networks=getListView();
networkItems=newarraylist();
listAdapter=new NetworksListAdapter(getActivity(),networkItems);
networks.setAdapter(listAdapter);
JSONObject参数=新的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=新建Response.Listener(){
@凌驾
公共void onResponse(JSONObject响应){
JSONArray jsonNetworks=response.optJSONArray(“网络”);
int len=jsonNetworks.length();
对于(int i=0;i
最后一行负责让截击发送请求


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

如果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();
}
@覆盖
公共void onResponse(JSONObject响应){
新线程(newrunnable()){
@凌驾
公开募捐{
JSONArray jsonNetworks=response.optJSONArray(“网络”);
int len=jsonNetworks.length();
对于(int i=0;i
Volley实际上在后台处理它的工作负载。但是,监听器或默认情况下在UI线程上运行-这是您的职责。如果您跳过帧,这是在UI线程上执行的某种长操作。请尝试放置信息性日志打印,以查明该操作的确切位置,并将其移动到background线程。这个概念似乎是正确的,应该可以工作,但我认为您的代码不正确。好的,所以我缓解了一个问题,即
runOnUiThread
需要
getActivity().runOnUiThread
因为这是一个片段。唯一的另一个问题是我引用了
响应
,它不是最终变量。修复了它。就在
新线程(new Runnable()行)的正上方{
,我刚刚写了
最终的JSONObject jsonResponse=response;
并用jsonResponse替换了response。好吧……如果有很多数据需要处理,显示进度对话框/栏将是个好主意?是否可以在截取的onResponse中这样做而不冒窗口泄漏的风险?