I'm trying to send a picture to rails server from Android. But when I send, I get the following error.
09-19 23:22:11.810: W/System.err(2704): org.apache.http.client.ClientProtocolException
09-19 23:22:12.000: W/System.err(2704): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:557)
09-19 23:22:12.020: W/System.err(2704): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
09-19 23:22:12.020: W/System.err(2704): at com.loopj.android.http.AsyncHttpRequest.makeRequest(AsyncHttpRequest.java:73)
09-19 23:22:12.050: W/System.err(2704): at com.loopj.android.http.AsyncHttpRequest.makeRequestWithRetries(AsyncHttpRequest.java:92)
09-19 23:22:12.050: W/System.err(2704): at com.loopj.android.http.AsyncHttpRequest.run(AsyncHttpRequest.java:54)
09-19 23:22:12.050: W/System.err(2704): at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:444)
09-19 23:22:12.050: W/System.err(2704): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
09-19 23:22:12.050: W/System.err(2704): at java.util.concurrent.FutureTask.run(FutureTask.java:138)
09-19 23:22:12.050: W/System.err(2704): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
09-19 23:22:12.060: W/System.err(2704): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
09-19 23:22:12.070: W/System.err(2704): at java.lang.Thread.run(Thread.java:1019)
09-19 23:22:12.250: W/System.err(2704): Caused by: org.apache.http.client.NonRepeatableRequestException: Cannot retry request with a non-repeatable request entity
09-19 23:22:12.320: W/System.err(2704): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:413)
09-19 23:22:12.360: W/System.err(2704): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
09-19 23:22:12.370: W/System.err(2704): ... 10 more
What's weird is I don't get this error every time uploading a picture, just sometimes when doing the same process. Here are my codes. I'm using "AsyncHttpClient" (http://loopj.com/android-async-http/) for http connection.
public class AsynchConnector{
static AsyncHttpClient client = new AsyncHttpClient();
private static final String BASE_URL = Environment.SERVER_URL;
public static void post(String url, RequestParams params, AsyncHttpResponseHandler responseHandler){
Log.w("web", "sending POST requset to " + getAbsoluteUrl(url));
client.post(getAbsoluteUrl(url), params, responseHandler);
}
}
public static void postPicture(String serverAlbumId, String serverUserId, String filePath){
RequestParams params = new RequestParams();
params.put("user_id", CameraApp.sp.getString("server_user_id", ""));
params.put("picture[album_id]", serverAlbumId);
params.put("picture[user_id]", serverUserId);
try{
params.put("picture[image]", StorageAccessor.getPictureAsFile(filePath));
}catch(FileNotFoundException e){
Log.e("---", "no image file found ");
}
Log.i("----------", "starting to post picture");
AsynchConnector.post(PICTURE_PATH, params, new AsyncHttpResponseHandler(){
public void onSuccess(String response) {
Log.i("POST_PICTURE_RESOPNSE", response);
}
});
}
That was due the OutputStreamWriter class used in AsynchHttpClient. This post might help understanding what's happening.
http://httpcomponents.10934.n7.nabble.com/Http-Multi-part-exception-when-using-InputStreamBody-td12820.html
And I solved this by implementing onFailure(Throwable error) method in ResponseHandler that does the same thing again. (in my case, invoking postPicture method.)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With