Когда метод, который возвращает растровое изображение, терпит неудачу, как бороться с этим? - PullRequest
1 голос
/ 23 марта 2012

Я работаю над кодом, который заполняет GridView, полный изображений, которые были извлечены из YouTube. Теперь он работает отдельно от случая, когда он не может найти изображение, я не уверен, почему он не может найти изображение, так как ссылка на изображение работает в браузере, но на самом деле это работает на мое преимущество, так как отсеивает видео, которые были удалено из-за авторского права / закрытия счета и т. д.

Мой код для получения изображения выглядит следующим образом

Вызов

        final Object item = allMatches.get(position);
        if(item != null) {
        Bitmap bitmap = loadBitmap("http://i2.ytimg.com/vi/"+ allMatches.get(position).toString() + "/default.jpg"); 
        imageView.setImageBitmap(bitmap);
        }
        else { imageView.setImageDrawable(getResources().getDrawable(R.drawable.default1)); }

LoadBitmap ()

    public static Bitmap loadBitmap(String url) 
  {
      Bitmap bitmap = null;
      InputStream in = null;
      BufferedOutputStream out = null;

      try {
          in = new BufferedInputStream(new URL(url).openStream(),  4 * 1024);

          final ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
          out = new BufferedOutputStream(dataStream,  4 * 1024);

          int byte_;
          while ((byte_ = in.read()) != -1)
              out.write(byte_);
          out.flush();

          final byte[] data = dataStream.toByteArray();
          BitmapFactory.Options options = new BitmapFactory.Options();
          //options.inSampleSize = 1;

          bitmap = BitmapFactory.decodeByteArray(data, 0, data.length,options);
      } catch (IOException e) {
          Log.e("","Could not load Bitmap from: " + url);
      } finally {
          try{
              in.close();
              out.close();
          }catch( IOException e )
          {
              System.out.println(e);
          }
      }
      return bitmap;

Так что это иногда может привести к сбою со следующей Stacktrace

03-23 01:47:10.087: E/(9757): Could not load Bitmap from: http://i2.ytimg.com/vi/8s3lnGuyC9M/default.jpg
03-23 01:47:10.247: W/dalvikvm(9757): threadid=1: thread exiting with uncaught exception (group=0x40018560)
03-23 01:47:10.267: E/AndroidRuntime(9757): FATAL EXCEPTION: main
03-23 01:47:10.267: E/AndroidRuntime(9757): java.lang.NullPointerException
03-23 01:47:10.267: E/AndroidRuntime(9757):     at com.myapp.Sample.loadBitmap(Sample.java:159)
03-23 01:47:10.267: E/AndroidRuntime(9757):     at com.myapp..Sample$ImageAdapter.getView(Sample.java:207)
03-23 01:47:10.267: E/AndroidRuntime(9757):     at android.widget.AbsListView.obtainView(AbsListView.java:1467)
03-23 01:47:10.267: E/AndroidRuntime(9757):     at android.widget.GridView.onMeasure(GridView.java:935)
03-23 01:47:10.267: E/AndroidRuntime(9757):     at android.view.View.measure(View.java:8330)
03-23 01:47:10.267: E/AndroidRuntime(9757):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
03-23 01:47:10.267: E/AndroidRuntime(9757):     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1017)
03-23 01:47:10.267: E/AndroidRuntime(9757):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:386)
03-23 01:47:10.267: E/AndroidRuntime(9757):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:309)
03-23 01:47:10.267: E/AndroidRuntime(9757):     at android.view.View.measure(View.java:8330)
03-23 01:47:10.267: E/AndroidRuntime(9757):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
03-23 01:47:10.267: E/AndroidRuntime(9757):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
03-23 01:47:10.267: E/AndroidRuntime(9757):     at android.view.View.measure(View.java:8330)
03-23 01:47:10.267: E/AndroidRuntime(9757):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:531)
03-23 01:47:10.267: E/AndroidRuntime(9757):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:309)
03-23 01:47:10.267: E/AndroidRuntime(9757):     at android.view.View.measure(View.java:8330)
03-23 01:47:10.267: E/AndroidRuntime(9757):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
03-23 01:47:10.267: E/AndroidRuntime(9757):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
03-23 01:47:10.267: E/AndroidRuntime(9757):     at android.view.View.measure(View.java:8330)
03-23 01:47:10.267: E/AndroidRuntime(9757):     at android.view.ViewRoot.performTraversals(ViewRoot.java:843)
03-23 01:47:10.267: E/AndroidRuntime(9757):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1865)
03-23 01:47:10.267: E/AndroidRuntime(9757):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-23 01:47:10.267: E/AndroidRuntime(9757):     at android.os.Looper.loop(Looper.java:130)
03-23 01:47:10.267: E/AndroidRuntime(9757):     at android.app.ActivityThread.main(ActivityThread.java:3835)
03-23 01:47:10.267: E/AndroidRuntime(9757):     at java.lang.reflect.Method.invokeNative(Native Method)
03-23 01:47:10.267: E/AndroidRuntime(9757):     at java.lang.reflect.Method.invoke(Method.java:507)
03-23 01:47:10.267: E/AndroidRuntime(9757):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
03-23 01:47:10.267: E/AndroidRuntime(9757):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
03-23 01:47:10.267: E/AndroidRuntime(9757):     at dalvik.system.NativeStart.main(Native Method)

Что мне нужно сделать, так это просто быть в состоянии справиться с этим, не имея возможности получить изображение. Мои навыки Java ограничены, но я хочу что-то вроде ниже (но на самом деле работает)

Bitmap bitmap = loadBitmap("http://i2.ytimg.com/vi/"+ allMatches.get(position).toString() + "/default.jpg"); //  

if (bitmap == null) {
   imageView.setImageBitmap(defaultBitmap); 
} else {
imageView.setImageBitmap(bitmap); }

или

//Doesn't work anyway due to 'Exception IOException is not compatible with throws clause in Adapter.getView'
try { 
Bitmap bitmap = loadBitmap("http://i2.ytimg.com/vi/"+ allMatches.get(position).toString() + "/default.jpg"); 
imageView.setImageBitmap(bitmap);
}catch( IOException ) {
imageView.setImageBitmap(defaultBitmap);
}

Мое понимание блоков try catch заключается в том, что если вы «поймаете ошибку», код должен продолжаться. В этом случае не должно ли это просто печатать ошибку в журнал и продолжать?

Как я могу это сделать, когда «loadBitmap» не удается получить изображение?

РЕДАКТИРОВАТЬ: я обновил код в соответствии с некоторыми комментариями пользователей - он по-прежнему выдает точно такую ​​же ошибку, он просто устраняет некоторые сомнения в отношении точки сбоя. Также для уточнения

Line 159: in.close();
Line 207: Bitmap bitmap = loadBitmap("http://i2.ytimg.com/vi/"+ allMatches.get(position).toString() + "/default.jpg"); 

Ответы [ 3 ]

0 голосов
/ 23 марта 2012

Я собирался сказать то же самое, что и edthethird.Вы должны избегать ловли Exception, когда это возможно.Вы говорите, что это не работает, поэтому не могли бы вы сказать нам, какие строки 159 и 207 вашего класса Sample.java, где произошло исключение NullPointerException?Было бы очень полезно понять проблему.

Куда указывает эта строка?Похоже, вы не цитируете его в своем вопросе:

03-23 01:47:10.267: E/AndroidRuntime(9757):     at com.myapp..Sample$ImageAdapter.getView(Sample.java:207)

И почему бы вам не установить изображение по умолчанию в качестве локального рисунка вместо того, чтобы извлекать его с веб-сайта?

0 голосов
/ 23 марта 2012

Первый:

try
{
    Bitmap bitmap = loadBitmap("http://i2.ytimg.com/vi/"+ allMatches.get(position).toString() + "/default.jpg"); 
    imageView.setImageBitmap(bitmap);
}
catch(IOException e)
{
    System.err.println("Couldn't load image: "+e.getMessage());
    imageView.setImageDrawable(getResources().getDrawable(R.drawable.default1)); 
}

Второй:

public static Bitmap loadBitmap(String url) throws IOException
{
    final InputStream in = new BufferedInputStream(new URL(url).openStream(),  4 * 1024);

    try 
    {
        final ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
        final BufferedOutputStream out = new BufferedOutputStream(dataStream,  4 * 1024);

        try
        {
            int byte_;
            while ((byte_ = in.read()) != -1)
                out.write(byte_);
            out.flush();

            final byte[] data = dataStream.toByteArray();
            BitmapFactory.Options options = new BitmapFactory.Options();
            //options.inSampleSize = 1;

            return BitmapFactory.decodeByteArray(data, 0, data.length,options);
        }
        finally
        {
            out.close();
        }
    } 
    finally 
    {
        in.close();
    }
}
0 голосов
/ 23 марта 2012

Это ошибка:

catch (IOException e) 
{
    Log.e("","Could not load Bitmap from: " + url);
    // If IOExceotion occurs, the `bitmap` variable is null, right?
    bitmap = bitmap.loadBitmap("http://i2.ytimg.com/vi/k4v9JWUhveY/default.jpg");
    //       ^^^^^^ NullPointerException will be thrown and IOException will be lost (overwritten by NullPointerException).
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...