Проблемы с HttpClient, когда функция используется различными устройствами одновременно

1

Использование httpclient (apache credentials) подключения для загрузки различных растровых изображений с различными устройствами не работает.... с одним работает нормально, почему?

Я закрываю соединение правильно? Я не уверен в этом, я смотрю на подобные учетные данные http-соединений.

Я разрабатываю приложение для android (java), которое подключается к серверу для загрузки 50 растровых изображений, и каждый раз я использую эту функцию для загрузки каждого растрового изображения:

public static Bitmap getRemoteBitmap(String url) {      
    Bitmap bm=null;
    HttpClient httpclient = new DefaultHttpClient(); 
    HttpResponse response; 
    try { 
         ((AbstractHttpClient) httpclient).getCredentialsProvider().setCredentials(
                new org.apache.http.auth.AuthScope(null,-1), 
                new org.apache.http.auth.UsernamePasswordCredentials(MagazineStatus._username, MagazineStatus._password)); 

        response = httpclient.execute(new HttpGet(url)); 
        StatusLine statusLine = response.getStatusLine(); 
        if(statusLine.getStatusCode() == HttpStatus.SC_OK) { 
            try {                   
                HttpEntity entity = response.getEntity();
                InputStream content = entity.getContent();
                bm=BitmapFactory.decodeStream(content );
            }catch(Exception ex) {Log.e("DBF Error",ex.toString());}                 
        }else { 
            response.getEntity().getContent().close(); 
            throw new IOException(statusLine.getReasonPhrase()); 
        } 
    }catch(ClientProtocolException cpe) {
        Log.e("ClientProtocolException @ at FPT",cpe.toString());
    } catch(Exception ex) {
        Log.e("Exception at FETCHPROJECTASK",ex.toString());
    } 
    return bm;
}

Если я пытаюсь загрузить растровые изображения с одного устройства, он отлично работает, но если я попытаюсь загрузить растровые изображения с 3 или 4 устройствами одновременно, то что-то не сработает с этой функцией, потому что эта строка bm=BitmapFactory.decodeStream(content ); дает мне aa null bitmap, и я не понимаю, почему, потому что content, entity, statusLine и response не являются нулевыми.

Это значения для этих переменных, когда битмап bm имеет значение null:

ответ:

"response"   (id=830078599368)  
    entity  BasicManagedEntity  (id=830078617768)   
    headergroup HeaderGroup  (id=830078599408)  
    locale  Locale  (id=830078292336)   
    params  ClientParamsStack  (id=830079041944)    
    reasonCatalog   EnglishReasonPhraseCatalog  (id=830004685872)   
    statusline  BasicStatusLine  (id=830078599344)

строка статуса:

"statusLine"     (id=830078599344)  
    protoVersion    HttpVersion  (id=830004713800)  
    reasonPhrase    "OK" (id=830078599288)  
    statusCode  200 

организация:

"entity"     (id=830078617768)  
    attemptReuse    false   
    managedConn null    
    wrappedEntity   BasicHttpEntity  (id=830078612272)  

содержание:

"content"    (id=830078617792)  
    skipBuf null    
    eofWatcher  BasicManagedEntity  (id=830078617768)   
    selfClosed  false   

Я делаю что-то неправильно? правильно ли соединение закрыто? можно ли это улучшить? Любая помощь будет оценена.

благодаря

РЕДАКТИРОВАТЬ:

Правильный способ закрыть соединение - добавить этот код?

content.close();
entity.consumeContent();

Или мне нужно добавить что-то еще?

благодаря

  • 0
    Можете ли вы опубликовать полную трассировку стека исключений?
  • 0
    не исключение, это только дает мне нулевое растровое изображение ... это объясняется на вопрос
Показать ещё 1 комментарий
Теги:
httpclient
httpresponse

2 ответа

1
Лучший ответ

Из чтения вашего описания проблемы проблема, кажется, находится на стороне. Поскольку вы добавляете больше клиентов, которые работают независимо друг от друга, которые обращаются к бэкенду одновременно, ваш back-end, похоже, не может иметь дело с несколькими параллельными запросами.
Хотя, судить об этом недостаточно. И мой вывод основан на недостаточных данных.

  • 0
    я получил тестирование проблемы только с двумя или тремя устройствами, я думаю, что проблема не на внутренней стороне, потому что она должна разрешать соединения от тысяч пользователей, а не только от одного или двух
  • 0
    я правильно закрываю соединение?
Показать ещё 3 комментария
0

Попробуйте следующее:

    HttpGet httpRequest = new HttpGet(URI.create(path) );
    HttpClient httpclient = new DefaultHttpClient();
    HttpResponse response = (HttpResponse) httpclient.execute(httpRequest);
    HttpEntity entity = response.getEntity();
    BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(entity);
    bmp = BitmapFactory.decodeStream(bufHttpEntity.getContent());
    httpRequest.abort();

Примечание. Тип пути - строка.

Проблема заключалась в том, что, как только вы используете InputStream из HttpUrlConnection, вы не можете перемотать и снова использовать тот же InputStream. Поэтому вам необходимо создать новый InputStream для фактической выборки изображения. В противном случае мы должны прервать запрос http.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню