2013-08-18 1 views
0

Google Play의 앱에 오류 보고서가 표시됩니다. asynctask를 사용하여 이미지를 얻었지만 테스트 한 모든 장치에서 작동하지만 문제가있는 일부 사용자가 있습니다. 정말 드문 일이지만 디버깅하고 수정해야합니다.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()); 

내가 어떤 이유로 변수 이미지 URL이 실제 URL을 beeing는하지에 대해 생각하고는 이렇게 doInBackground 방법입니다 내가 생각할 수있는 유일한 것은 "http"와 "jpg"를 포함하기 위해 추출 된 문자열 변수를 검사하는 것이고 이것이 현재 Flurry를 사용하여이 정보를 저장하지 않는다면 확인하는 것입니다.

asynctask가 실행되기 전에 인터넷 연결의 가용성에 대한 검사가 수행되므로이 ​​문제를 일으킬 수 없습니다.

누구나이 문제를 일으키는 다른 요인을 생각할 수 있습니까? 당신이 예외가 발생하는 경우

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

imageURl을 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(); 
     } 

그런 다음 귀하의 이미지 URL이 null이됩니다 여기에 충돌 보고서의 내 전체 스택 트레이스 기록이다. 그래서, 여기 : imageurl 만 선언되었지만 초기화되지 않기 때문에

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

당신은 NullPointerException이 얻을 것이다. 그래서 상단에이를 변경 :이 작품

URL imageurl=null

희망을. 행운을 빌어 요. 그냥 완성도를 위해서

+0

고맙다. 나는 이것을 시험 할 것이다. 나는 아직도 이것이 가능한 방법을 추적 할 필요가 있지만, 적어도 내 응용 프로그램이 충돌하는 것을 막을 것입니다. –

1

:

당신이 try/catch 블록 내에서 얻은 값으로 작업해야하는 경우 당신이 할 shoulddn't 예외를 무시하는 코드에서! 대신 더 나은 코드를 작성하는 것이 더 좋으며 이러한 상황을 피할 수 있습니다. Exception가 발생할 때

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; 
    } 
} 

이 코드는 즉시 종료되고 try/catch 블록 내에는 모든 것이 잘 작동한다고 가정합니다.

Eclipse가 코드 컴파일을 거부하고 IDE 도우미 메소드를 통해 자동 시도/catch 블록을 추가하기 때문에 예외를 무시하는 대신 예외를 올바르게 처리하는 방법을 배워야합니다.