OKhttp获取response时遇到的坑

  • 运行到response.body().string()一步时抛异常,java.lang.IllegalStateException: closed;或者是在

  • 我们在调试的时候喜欢Log一下看看数据正不正常,我在使用HttpURLConnection  或者 HttpClient 获取Response时都是先Log看看然后再传输给其他函数去解析,没有出现这样的问题;

   但是在使用OKhttp时就不正常了,因为调用了一次response.body().string(),那么这个流就已经被关闭了。所以想要Log,又要解析的时候,解决的办法是暂存一下这个数据:

   String tempResponse =  response.body().string();然后使用这个暂存的数据tempResponse 

        new Thread(new Runnable() {
            @Override
            public void run() {
                OkHttpClient okHttpClient = new OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS).writeTimeout(10,TimeUnit.SECONDS).build();
                MediaType mediaType = MediaType.parse("application/octet-stream");
//                MediaType mediaType = MediaType.parse("Content-Disposition: form-data; name=\"imgUploader\"; filename=\"logs_0.csv\"\n"+"mimetype:application/octet-stream");
                String fileName = "12715689.mp4";
                RequestBody fileBody = RequestBody.create(mediaType,new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/DCIM/"+fileName));
                RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM)
                        .addPart(Headers.of("Content-Disposition","form-data; name=\"imgUploader\"; filename="+fileName),fileBody).build();
                HashMap<String,String> hashMap = new HashMap<>();
                hashMap.put("content-type","text/html; charset=utf-8;");

                hashMap.put("user-agent","Android");

                Headers headers = Headers.of(hashMap);

                Request request = new Request.Builder().headers(headers).post(requestBody).url("http://192.168.11.102:2000/api/Upload/").build();
                okhttp3.Call call = okHttpClient.newCall(request);


                call.enqueue(new okhttp3.Callback() {
                    @Override
                    public void onFailure(okhttp3.Call call, IOException e) {
                        Log.i(TAG,"Throwable:"+e.toString());
                    }

                    @Override
                    public void onResponse(okhttp3.Call call, final okhttp3.Response response) throws IOException {
                        final String response1 = response.body().string();
                        Log.i(TAG,"response:"+response1);
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {

                                    Toast.makeText(getApplicationContext(),response1,Toast.LENGTH_SHORT).show();

                            }
                        });
                    }
                });

            }
        }).start();

  

posted on 2018-07-16 15:08  endian11  阅读(10027)  评论(0编辑  收藏  举报

导航