这个错误的原因是什么 java.io.IOException: Content-Length 和 stream length 不一致
What is the reason of this error java.io.IOException: Content-Length and stream length disagree
我遇到这个错误
java.io.IOException: Content-Length and stream length disagree
这行代码return response.body().bytes();
这是完整代码
编辑:经过一些 google 错误的原因来自 okhttp lib
if (contentLength != -1L && contentLength != bytes.size.toLong()) {
throw IOException(
"Content-Length ($contentLength) and stream length (${bytes.size}) disagree")
}
但是如何解决这个问题?
编辑:
这是完整代码:
public class OkHttpHandler extends AsyncTask<Void, Void, byte[]> {
private final String Fetch_URL = "http://justedhak.comlu.com/get-data.php";
ArrayList<Listitem> Listitem;
int resulta;
OkHttpClient httpClient = new OkHttpClient();
String myJSON;
JSONArray peoples = null;
InputStream inputStream = null;
@Override
protected byte[] doInBackground(Void... params) {
Log.d("e", "dddddddddd");
Log.d("e", Fetch_URL);
Request.Builder builder = new Request.Builder();
builder.url(Fetch_URL);
Request request = builder.build();
String result = null;
try {
Response response = httpClient.newCall(request).execute();
// int statusCode = response.getStatusLine().getStatusCode();
int statusCode =200;
// HttpEntity entity = response.body().byteStream();
if (statusCode == 200) {
byte[] buffer = new byte[8192];
int bytesRead;
ByteArrayOutputStream output = new ByteArrayOutputStream();
while ((bytesRead = inputStream.read(buffer)) != -1) {
output.write(buffer, 0, bytesRead);
// inputStream = response.body().byteStream();
// json is UTF-8 by default
// BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8);
/* StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null)
{
sb.append(line + "\n");
}
result = sb.toString();*/
resulta = 1; //"Success
Log.d("e", "response.");
return response.body().bytes();
}
else
{
resulta = 0; //"Failed
}
} catch (Exception e) {
Log.d("e", "r2r2 error");
e.printStackTrace(); }
finally {
try{if(inputStream != null)inputStream.close();}catch(Exception squish){}
}
return null;
}
protected void onPostExecute(String result){
if( resulta ==1){
myJSON=result;
showList();
}
else{
Log.e("d","zzzzzzzz");
}
}
protected void showList(){
try {
Log.e("d","jjjjjjjjjj");
JSONObject jsonObj = new JSONObject(myJSON);
peoples = jsonObj.getJSONArray("result");
Listitem = new ArrayList<Listitem>();
for(int i=0;i<peoples.length();i++){
JSONObject c = peoples.getJSONObject(i);
String id = c.getString("id");
String url = c.getString("path");
Listitem.add(new Listitem(id,url));
Log.e("d","ppppp");
}
// GridViewAdapter adapter = new GridViewAdapter(this, R.layout.grid_item_layout, Listitem);
// gridView.setAdapter(gridAdapter);
// adapter.notifyDataSetChanged();
// list.setAdapter(adapter);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
抛出异常是因为您调用了 InputStream inputStream = response.body().byteStream();
然后又调用了 response.body().bytes();
。
您可以使用 inputStream
或 return result.getBytes();
中的 return 字节数组来代替 return。
从inputStream到bytes参考如下:
public byte[] getBytesFromInputStream(InputStream inputStream) throws IOException {
try {
byte[] buffer = new byte[8192];
int bytesRead;
ByteArrayOutputStream output = new ByteArrayOutputStream();
while ((bytesRead = inputStream.read(buffer)) != -1) {
output.write(buffer, 0, bytesRead);
}
return output.toByteArray();
} catch (OutOfMemoryError error) {
return null;
}
}
更新:
如果你在ResponseBody.class
调试,你会看到如下截图:
我遇到这个错误
java.io.IOException: Content-Length and stream length disagree
这行代码return response.body().bytes();
这是完整代码
编辑:经过一些 google 错误的原因来自 okhttp lib
if (contentLength != -1L && contentLength != bytes.size.toLong()) {
throw IOException(
"Content-Length ($contentLength) and stream length (${bytes.size}) disagree")
}
但是如何解决这个问题?
编辑:
这是完整代码:
public class OkHttpHandler extends AsyncTask<Void, Void, byte[]> {
private final String Fetch_URL = "http://justedhak.comlu.com/get-data.php";
ArrayList<Listitem> Listitem;
int resulta;
OkHttpClient httpClient = new OkHttpClient();
String myJSON;
JSONArray peoples = null;
InputStream inputStream = null;
@Override
protected byte[] doInBackground(Void... params) {
Log.d("e", "dddddddddd");
Log.d("e", Fetch_URL);
Request.Builder builder = new Request.Builder();
builder.url(Fetch_URL);
Request request = builder.build();
String result = null;
try {
Response response = httpClient.newCall(request).execute();
// int statusCode = response.getStatusLine().getStatusCode();
int statusCode =200;
// HttpEntity entity = response.body().byteStream();
if (statusCode == 200) {
byte[] buffer = new byte[8192];
int bytesRead;
ByteArrayOutputStream output = new ByteArrayOutputStream();
while ((bytesRead = inputStream.read(buffer)) != -1) {
output.write(buffer, 0, bytesRead);
// inputStream = response.body().byteStream();
// json is UTF-8 by default
// BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8);
/* StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null)
{
sb.append(line + "\n");
}
result = sb.toString();*/
resulta = 1; //"Success
Log.d("e", "response.");
return response.body().bytes();
}
else
{
resulta = 0; //"Failed
}
} catch (Exception e) {
Log.d("e", "r2r2 error");
e.printStackTrace(); }
finally {
try{if(inputStream != null)inputStream.close();}catch(Exception squish){}
}
return null;
}
protected void onPostExecute(String result){
if( resulta ==1){
myJSON=result;
showList();
}
else{
Log.e("d","zzzzzzzz");
}
}
protected void showList(){
try {
Log.e("d","jjjjjjjjjj");
JSONObject jsonObj = new JSONObject(myJSON);
peoples = jsonObj.getJSONArray("result");
Listitem = new ArrayList<Listitem>();
for(int i=0;i<peoples.length();i++){
JSONObject c = peoples.getJSONObject(i);
String id = c.getString("id");
String url = c.getString("path");
Listitem.add(new Listitem(id,url));
Log.e("d","ppppp");
}
// GridViewAdapter adapter = new GridViewAdapter(this, R.layout.grid_item_layout, Listitem);
// gridView.setAdapter(gridAdapter);
// adapter.notifyDataSetChanged();
// list.setAdapter(adapter);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
抛出异常是因为您调用了 InputStream inputStream = response.body().byteStream();
然后又调用了 response.body().bytes();
。
您可以使用 inputStream
或 return result.getBytes();
中的 return 字节数组来代替 return。
从inputStream到bytes参考如下:
public byte[] getBytesFromInputStream(InputStream inputStream) throws IOException {
try {
byte[] buffer = new byte[8192];
int bytesRead;
ByteArrayOutputStream output = new ByteArrayOutputStream();
while ((bytesRead = inputStream.read(buffer)) != -1) {
output.write(buffer, 0, bytesRead);
}
return output.toByteArray();
} catch (OutOfMemoryError error) {
return null;
}
}
更新:
如果你在ResponseBody.class
调试,你会看到如下截图: