2013-08-18 2 views
0

Я получаю сообщение о сбоях в приложении Google Play. Я использую asynctask для получения изображения, он работает на каждом тестируемом устройстве, но некоторые пользователи имеют проблемы с ним. Это очень редко, но мне нужно отлаживать и исправлять это. Это метод doInBackground:Отчет о сбоях в AsyncTask

public class MetaTask extends AsyncTask<Void, Void, Void> { 
    URL imageurl; 

    @Override 
    protected Void doInBackground(Void... params) { 
     try { 
      doc = Jsoup.connect(data).get(); 
      Elements meta = doc.select("meta[property=og:image]"); 
      for (Element element : meta) { 
       extracted = element.attr("content"); 
      } 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 

      e.printStackTrace(); 
     } 

     try { 
      imageurl = new URL(extracted); 
     } catch (MalformedURLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     try { 
      bitmap = BitmapFactory.decodeStream(imageurl.openConnection() 
        .getInputStream()); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     return null; 
    } 

NullPointer, кажется, на этой линии (271):

bitmap = BitmapFactory.decodeStream(imageurl.openConnection() 
       .getInputStream()); 

Я думаю о том почему переменная ImageUrl не неоспоримым фактический адрес, то Единственное, что я могу придумать, это проверить строковую переменную, извлеченную для содержания «http» и «jpg», и если они не хранят эту информацию с помощью Flurry.

Перед выполнением асинхронной проверки выполняется проверка доступности интернет-соединения, поэтому это не может быть причиной этого.

Может ли кто-нибудь подумать о чем-то другом, вызывающем это? Вот мой полный StackTrace запись отчетов о сбоях:

java.lang.RuntimeException: An error occured while executing doInBackground() 
at android.os.AsyncTask$3.done(AsyncTask.java:278) 
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
at java.lang.Thread.run(Thread.java:856) 
Caused by: java.lang.NullPointerException 
at  com.ddroid.photosaveinstagram.MainActivity$MetaTask.doInBackground(MainActivity.java:271) 
at com.ddroid.photosaveinstagram.MainActivity$MetaTask.doInBackground(MainActivity.java:1) 
at android.os.AsyncTask$2.call(AsyncTask.java:264) 
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
... 5 more 
+0

если вы регистрируете изображениеURl внутри блока try, то это null? –

+0

Да, я могу попробовать, используя Flurry. Проблема в том, что я тестировал это на 9 устройствах. Он всегда работал, но они поступают от пользователей. –

+0

Ваша ошибка связана с злоупотреблением try/catch для исключения/игнорирования исключений. Исключения не должны игнорироваться, а обрабатываться. Когда исключение происходит в одной точке («imageUrl» в вашем случае), и это значение необходимо, выполнение всего блока, который должен быть остановлен. Вы не должны выполнять код, который зависит от переменной/объектов из try/catch, которую вы подавили, но не обрабатывали правильно. – Tseng

ответ

1

Что делать, если вы получите исключение в:

try { 
      imageurl = new URL(extracted); 
     } catch (MalformedURLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

Тогда ваш ImageUrl будет нулевым. Так, здесь:

try { 
      bitmap = BitmapFactory.decodeStream(imageurl.openConnection() 
        .getInputStream()); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

вы получите NullPointerException, потому что imageurl только декларироваться, но не инициализирован. Таким образом, изменить это на вершине:

URL imageurl=null

Надеется, что это работает. Удачи.

+0

Спасибо, я попробую это. Мне все еще нужно отслеживать, как это возможно, но это, по крайней мере, остановит мое приложение от сбоев. –

1

Просто для полноты картины:

В своем коде вы игнорируете исключения, которые вы shoulddn't делать, если вам нужно работать со значениями, полученными в try/catch блоке! Вместо этого лучше улучшать код и избегать таких ситуаций.

public class MetaTask extends AsyncTask<Void, Void, Void> { 
    URL imageurl; 

    @Override 
    protected Void doInBackground(Void... params) { 
     try { 
      doc = Jsoup.connect(data).get(); 
      Elements meta = doc.select("meta[property=og:image]"); 
      for (Element element : meta) { 
       extracted = element.attr("content"); 
      } 

      imageurl = new URL(extracted); 
      bitmap = BitmapFactory.decodeStream(imageurl.openConnection() 
        .getInputStream()); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 

      e.printStackTrace(); 

      // Notify user that an IO error occured 
     } catch (MalformedURLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 

      // Notify user that the URL is invalid 
     } catch (Exception e) { 
      // Ignore all other errors... probably not a good idea unless you know what you do 
     } 

     return null; 
    } 
} 

Этот код выхода, как только Exception происходит и внутри try/catch блока он предположил, что все работает хорошо.

Вы должны научиться правильно обрабатывать исключения, вместо того чтобы игнорировать их, потому что Eclipse отказывается компилировать ваш код, и вы добавляете блок автотрейпа/catch с помощью вспомогательных методов IDE.

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