2015-08-17 5 views
2

Мне нужна помощь в рефакторинге некоторого кода. У меня есть эти методы для получения растрового изображения, они делают что-то подобное, где они декодируют входной поток в растровое изображение. Я должен окружить открытие входного потока в 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; 
} 

ответ

2

попробуйте скольжение или пикассо.

Я использую скольжение. ссылка здесь https://github.com/bumptech/glide

и см. https://github.com/bumptech/glide/wiki Дополнительная информация.

//from glide document 
public void onCreate(Bundle savedInstanceState) { 
    ... 
    ImageView imageView = (ImageView) findViewById(R.id.my_image_view); 

    Glide.with(this).load("http://goo.gl/gEgYUd").into(imageView); 
} 
+0

Спасибо за ответ, я использую скольжение самостоятельно, но в этом случае мне не нужно загружать изображение. Мне нужно напрямую получить доступ к растровым изображениям – Eoin

+0

, прочитав это, просто загрузите изображение. http://stackoverflow.com/questions/27640307/android-glide-how-to-download-and-cache-bitmaps. – kfmes

+0

это хорошо, но единственная проблема заключается в том, что мне все еще нужно указывать ширину и высоту, но я не знаю, что это будет – Eoin

Смежные вопросы