2013-08-18 265 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块。