-
運行到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();