Повреждение данных загрузки файла httpclient на Android и проблемы с тайм-аутом

У меня проблемы с загрузкой изображений в 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 class:

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 или удалить его вообще. пытается играть с таймаутами. все тот же результат. конечные пользователи загружают испорченные изображения почти все время (хотя мне удавалось получить изображения bronem только 2 раза) .. размер изображения сначала был 2,5 мегабайта, но затем я уменьшил его до 500-700 кб. не устранил проблему.

не пытался изменить библиотеку apache ... возможно, это проблема ... но насколько я читал в сети, никто не сталкивался с этим с библиотекой httpmime.

что это может быть? я совершенно заблудился: (

другая проблема в том, что таймауты иногда не работают.

например, когда дело доходит до этой строки: HttpResponse resp = mHttpClient.execute (сообщение); и я отключаю соединение 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);

но все равно не работает :)

11
задан Alex 4 February 2011 в 10:29
поделиться