2013-08-18 330 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; 
    } 

的空指針似乎是在這條線(271):

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

我想出於某種原因變量IMAGEURL不beeing一個實際的URL時,我唯一能想到的就是檢查包含「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

如果您在try塊中記錄imageURl,它是否爲空? –

+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

只是爲了完整起見:

在你的代碼被忽略例外,如果你需要與try/catch塊中獲得的值來工作,你做shoulddn't!相反,更好的代碼更好,並避免這種情況。

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拒絕編譯您的代碼,並且您通過IDE輔助方法添加了自動嘗試/ catch塊。