Мне нужна помощь в рефакторинге некоторого кода. У меня есть эти методы для получения растрового изображения, они делают что-то подобное, где они декодируют входной поток в растровое изображение. Я должен окружить открытие входного потока в try/catch, наконец, на конце. Я заметил, что эти методы имеют много общего, и Id нравится реорганизовывать его, поэтому мне нужно написать try/catch только один раз.Упростить получение растрового изображения из Uri/Url
public static Bitmap fromUri(@NonNull Context context, @NonNull Uri uri) {
InputStream inputStream = null;
try {
inputStream = context.getContentResolver().openInputStream(uri);
return BitmapFactory.decodeStream(inputStream, null, new BitmapFactory.Options());
} catch (FileNotFoundException e) {
return null;
} catch (NullPointerException e) {
return null;
} finally {
try {
if (inputStream != null) {
inputStream.close();
}
} catch (IOException e) {
// ignore
}
}
}
public static Bitmap fromURL(@NonNull String src, @Nullable BitmapFactory.Options options) {
InputStream inputStream = null;
try {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet request = new HttpGet(src);
HttpResponse response = httpClient.execute(request);
inputStream = response.getEntity().getContent();
return BitmapFactory.decodeStream(inputStream, null, options);
} catch (Exception e) {
return null;
} finally {
if (inputStream != null) {
try {
//todo test that input stream is closed
inputStream.close();
} catch (IOException e) {
// ignore
}
}
}
}
Я думал о написании этого что-то вроде этого, но я не уверен, что он делает его более читаемым. Любые предложения по улучшению этого?
public static Bitmap fromUri(@NonNull Context context, @NonNull Uri uri) {
InputStream inputStream = getInputStream(context, uri);
return BitmapFactory.decodeStream(inputStream, null, new BitmapFactory.Options());
}
public static Bitmap fromURL(@NonNull String src, @Nullable BitmapFactory.Options options) {
InputStream inputStream = getInputStream(null, src);
return BitmapFactory.decodeStream(inputStream, null, options);
}
public static InputStream getInputStream(@Nullable Context context, @NonNull Object source){
InputStream inputStream = null;
try {
if(source instanceof String){
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet request = new HttpGet(String.valueOf(source));
HttpResponse response = httpClient.execute(request);
inputStream = response.getEntity().getContent();
} else if(source instanceof Uri){
inputStream = context.getContentResolver().openInputStream((Uri) source);
}
} catch (Exception e) {
return null;
} finally {
if (inputStream != null) {
try {
//todo test that input stream is closed
inputStream.close();
} catch (IOException e) {
// ignore
}
}
}
return inputStream;
}
Спасибо за ответ, я использую скольжение самостоятельно, но в этом случае мне не нужно загружать изображение. Мне нужно напрямую получить доступ к растровым изображениям – Eoin
, прочитав это, просто загрузите изображение. http://stackoverflow.com/questions/27640307/android-glide-how-to-download-and-cache-bitmaps. – kfmes
это хорошо, но единственная проблема заключается в том, что мне все еще нужно указывать ширину и высоту, но я не знаю, что это будет – Eoin