Использование 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();
Или мне нужно добавить что-то еще?
благодаря
Из чтения вашего описания проблемы проблема, кажется, находится на стороне. Поскольку вы добавляете больше клиентов, которые работают независимо друг от друга, которые обращаются к бэкенду одновременно, ваш back-end, похоже, не может иметь дело с несколькими параллельными запросами.
Хотя, судить об этом недостаточно. И мой вывод основан на недостаточных данных.
Попробуйте следующее:
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.