У меня проблемы с загрузкой изображений в android.
Я использую apache httpmime 4.1 lib код выглядит следующим образом:
MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
reqEntity.addPart("image", new FileBody(new File(AndorraApplication.getPhotosPath() + "/" + entity.getFileName()), "image/jpeg"));
resp = NetworkUtils.sendHttpRequestMultipart(EXPORT_PHOTOS_URI, reqEntity);
Класс NetworkUtils:
public class NetworkUtils {
public static final int REGISTRATION_TIMEOUT = 3 * 1000;
public static final int WAIT_TIMEOUT = 5 * 1000;
public static HttpResponse sendHttpRequestMultipart(String uri, MultipartEntity entity) {
HttpClient mHttpClient = new DefaultHttpClient();
final HttpParams params = mHttpClient.getParams();
HttpConnectionParams.setConnectionTimeout(params, REGISTRATION_TIMEOUT);
HttpConnectionParams.setSoTimeout(params, WAIT_TIMEOUT);
ConnManagerParams.setTimeout(params, WAIT_TIMEOUT);
HttpPost post = new HttpPost(uri);
post.addHeader(entity.getContentType());
post.setEntity(entity);
HttpResponse resp = mHttpClient.execute(post);
}
}
иногда все работает нормально, но иногда (особенно при медленном соединении) изображение загружается очень поврежденным. пример здесь: http://pixelbirthcloud.com/574_orig.jpg
он не генерирует никаких исключений. длина загруженного файла такая же, как и оригинальная.. попытался изменить тип mime на application/octet-stream или вообще удалить его. пытается играть с таймаутами. еще такой же результат. конечные пользователи загружают поврежденные изображения почти все время (хотя мне удалось получить бронзовые изображения всего 2 раза). Сначала размер изображения составлял 2,5 мегабайта, но затем я уменьшил его до 500-700 кб. Однако проблема не устранена.
не пытались изменить библиотеку apache. Возможно, это проблема. Но насколько я читал сеть, никто не испытывал этого с помощью библиотеки httpmime.
что это может быть? теперь я полностью потерян: (
Другая проблема заключается в том, что тайм-ауты иногда не работают.
как в этой строке: HttpResponse resp = mHttpClient.execute(post); и я отключу 3g-соединение, которое просто ждет, как 17-20 минут вместо 3 или 5 секунд.. и только потом выдает исключение. пробовал разные методы. например:
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
HttpProtocolParams.setUseExpectContinue(params, false);
HttpConnectionParams.setConnectionTimeout(params, 10000);
HttpConnectionParams.setSoTimeout(params, 10000);
ConnManagerParams.setMaxTotalConnections(params, 5);
ConnManagerParams.setTimeout(params, 30000);
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("http",PlainSocketFactory.getSocketFactory(), 80));
registry.register(new Scheme("https",PlainSocketFactory.getSocketFactory(), 80));
ThreadSafeClientConnManager manager = new ThreadSafeClientConnManager(params, registry);
HttpClient httpclient = new DefaultHttpClient(manager, params);
но все равно не работает:)