OkHTTPClient 挂在多部分请求上
OkHTTPClient hangs on Multipart request
我在 Android Lollipop 上 运行ning OkHTTP3,我有以下静态方法在多部分表单请求中上传图像:
public static void uploadImage(Context context, String imageTitle, Uri imageUri, CallbackReceiver callbackReceiver) {
ContentResolver contentResolver = context.getContentResolver();
MimeTypeMap mime = MimeTypeMap.getSingleton();
String type = mime.getExtensionFromMimeType(contentResolver.getType(imageUri));
String filePath = imageUri.toString();
String fileName = imageUri.getLastPathSegment();
File file = new File(filePath);
MediaType mediaType = MediaType.parse(type);
RequestBody rb = RequestBody.create(mediaType, file);
requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("image", fileName, rb)
.build();
Request request = new Request.Builder()
.url(RequestConstants.POST_IMAGE)
.addHeader(
RequestConstants.HTTP_HEADER_AUTHORIZATION,
RequestConstants.HTTP_AUTHORIZATION_PREFIX +
AccessToken.get())
.addHeader(
RequestConstants.HTTP_HEADER_ACCEPT,
RequestConstants.HTTP_APPLICATION_JSON)
.post(requestBody)
.build();
run(request, callbackReceiver);
RequestConstants 是在其他 GET 和 POST 请求中起作用的字符串值。
运行方法实现:
private static OkHttpClient client = new OkHttpClient();
private static void run(Request request, final CallbackReceiver callbackReceiver) {
try {
client.newCall(request).enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) throws IOException {
callbackReceiver.onSuccess(response);
}
@Override
public void onFailure(Call call, IOException e) {
callbackReceiver.onFailure(e);
}
});
} catch (Exception e) {
Log.e("OkHttpClient", e.getMessage());
}
}
每当我 运行 请求时,我都没有收到答复 - onSuccess 和 onFailure 回调都没有被执行。
在 Logcat 中,我可以看到有几个 'suspending all threads',这可能表明存在性能问题,尽管我正在使用非常小的图像 (~250kB) 进行测试。
知道是什么原因造成的吗?
我刚才解决了这个问题。为确保它不会无人问津:我增加了客户端的超时时间。我找不到修复它的代码。
我在 Android Lollipop 上 运行ning OkHTTP3,我有以下静态方法在多部分表单请求中上传图像:
public static void uploadImage(Context context, String imageTitle, Uri imageUri, CallbackReceiver callbackReceiver) {
ContentResolver contentResolver = context.getContentResolver();
MimeTypeMap mime = MimeTypeMap.getSingleton();
String type = mime.getExtensionFromMimeType(contentResolver.getType(imageUri));
String filePath = imageUri.toString();
String fileName = imageUri.getLastPathSegment();
File file = new File(filePath);
MediaType mediaType = MediaType.parse(type);
RequestBody rb = RequestBody.create(mediaType, file);
requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("image", fileName, rb)
.build();
Request request = new Request.Builder()
.url(RequestConstants.POST_IMAGE)
.addHeader(
RequestConstants.HTTP_HEADER_AUTHORIZATION,
RequestConstants.HTTP_AUTHORIZATION_PREFIX +
AccessToken.get())
.addHeader(
RequestConstants.HTTP_HEADER_ACCEPT,
RequestConstants.HTTP_APPLICATION_JSON)
.post(requestBody)
.build();
run(request, callbackReceiver);
RequestConstants 是在其他 GET 和 POST 请求中起作用的字符串值。
运行方法实现:
private static OkHttpClient client = new OkHttpClient();
private static void run(Request request, final CallbackReceiver callbackReceiver) {
try {
client.newCall(request).enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) throws IOException {
callbackReceiver.onSuccess(response);
}
@Override
public void onFailure(Call call, IOException e) {
callbackReceiver.onFailure(e);
}
});
} catch (Exception e) {
Log.e("OkHttpClient", e.getMessage());
}
}
每当我 运行 请求时,我都没有收到答复 - onSuccess 和 onFailure 回调都没有被执行。
在 Logcat 中,我可以看到有几个 'suspending all threads',这可能表明存在性能问题,尽管我正在使用非常小的图像 (~250kB) 进行测试。
知道是什么原因造成的吗?
我刚才解决了这个问题。为确保它不会无人问津:我增加了客户端的超时时间。我找不到修复它的代码。