このエラーが発生します
_ Java.io.IOException: Content-Length and stream length disagree
_
このコード行でreturn response.body().bytes();
これは完全なコードです
編集:いくつかのグーグルの後、エラーの理由は 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();
からのreturnbytes配列を使用して、それを返したい場合は使用できます。
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
でデバッグすると、次のスクリーンショットが表示されます。