的Android,排球请求,响应阻塞主线程

问题描述:

坏事使用抽射处理大反应时发生的事情:的Android,排球请求,响应阻塞主线程

String url = AppHelper.DOMAIN + "/service/pages/profile_update.json"; 

this.infoTextView.setText(getString(R.string.profile_info_updating)); 

final StringRequest stringRequest = new StringRequest(Request.Method.POST, url, 
     new Response.Listener<String>() { 
      @Override 
      public void onResponse(String response) { 
       try { 
        JSONObject json = new JSONObject(response); 

        if (json.getBoolean("success")) { 
         // manage JSON object here 
        } else { 
         Toast.makeText(ProfileActivity.this, 
           getString(R.string.connection_problem_server), 
           Toast.LENGTH_LONG).show(); 
        } 
       } catch (JSONException e) { 
        ProfileActivity.this.infoTextView.setText(
          getString(R.string.profile_info_updating_error)); 

        e.printStackTrace(); 
       } 
      } 
     }, new Response.ErrorListener() { 
    @Override 
    public void onErrorResponse(VolleyError error) { 
     ProfileActivity.this.infoTextView.setText(
       getString(R.string.profile_info_updating_error)); 

     if (error.networkResponse != null && error.networkResponse.statusCode == 401) { 
      Toast.makeText(ProfileActivity.this, 
        getString(R.string.connection_problem_permission), 
        Toast.LENGTH_LONG).show(); 
     } 

     new android.os.Handler().postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       if (ProfileActivity.this.swipeRefreshLayout != null) { 
        ProfileActivity.this.swipeRefreshLayout.setRefreshing(false); 
       } 
      } 
     }, 1000); 

     error.printStackTrace(); 
    } 
}) { 
    @Override 
    protected Map<String, String> getParams() { 
     Map<String, String> params = new HashMap<>(); 
     params.put("auth_token", ProfileActivity.this.defaultUser.getAuthenticationToken()); 
     return params; 
    } 

    @Override 
    public Map<String, String> getHeaders() throws AuthFailureError { 
     Map<String, String> params = new HashMap<>(); 
     params.putAll(super.getHeaders()); 
     params.put("Accept-Encoding", "gzip,deflate"); 
     return params; 
    } 

    @Override 
    protected Response<String> parseNetworkResponse(NetworkResponse response) { 
     StringBuilder output = new StringBuilder(); 
     try { 
      GZIPInputStream gStream = new GZIPInputStream(new ByteArrayInputStream(response.data)); 
      InputStreamReader reader = new InputStreamReader(gStream); 
      BufferedReader in = new BufferedReader(reader, 16384); 

      String read; 

      while ((read = in.readLine()) != null) { 
       output.append(read).append("\n"); 
      } 
      reader.close(); 
      in.close(); 
      gStream.close(); 
     } catch (IOException error) { 
      error.printStackTrace(); 
      return Response.error(new ParseError()); 
     } 

     return Response.success(output.toString(), HttpHeaderParser.parseCacheHeaders(response)); 
    } 
}; 

stringRequest.setRetryPolicy(new RetryPolicy() { 
    @Override 
    public int getCurrentTimeout() { 
     // 40 seconds 
     return 40000; 
    } 

    @Override 
    public int getCurrentRetryCount() { 
     return DefaultRetryPolicy.DEFAULT_MAX_RETRIES; 
    } 

    @Override 
    public void retry(VolleyError error) throws VolleyError { 
     throw error; 
    } 
}); 

Volley.newRequestQueue(this).add(stringRequest); 

这个代码块为主线,冻结的申请。

此外,我设置了一些标头值以允许gzip响应和代码来处理数据。但这并不是造成不良行为的因素。仅当onResponse(String response)开始时,应用程序才会冻结。

我该怎么做才能避免这种情况?

+1

,可能还存在的事实,你正在做的,而不是在JSON解析UI线程上,做'parseNetworkResponse' – EpicPandaForce

+0

代码似乎是罚款..你可以暴露此网络请求周围的代码的其他部分? – Dexto

onResponse和onErrorResponse在UI线程上调用,因此在这些方法中执行的任何繁重操作都会使应用程序的响应速度变慢。我想你正试图解析onResponse()中的响应,这是不正确的。

因为这个 是在后台线程中调用的方法,所以你必须移动到解析逻辑来解析网络响应。请参考以下链接了解详情:

https://developer.android.com/training/volley/request-custom.html

+1

谢谢你的回答! – zerokol

+0

如果调用请求是由IntentService创建的,那么onResponse()会在UI线程上执行呢? –

+0

Doest不管什么是调用线程。 onResponse()将在UI线程上调用。 –