关于AsyncTask的崩溃报告

时间:2013-08-18 04:25:14

标签: android android-asynctask bitmapfactory

我正在收到有关Google Play应用的崩溃报告。我使用asynctask获取图像,它适用于我测试的每个设备,但有一些用户遇到问题。这真的很少见,但我需要调试并解决这个问题。这是doInBackground方法:

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不是一个实际的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

2 个答案:

答案 0 :(得分:1)

如果您在以下情况下遇到例外该怎么办?

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

然后你的imageurl将为null。所以,在这里:

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

您将获得NullPointerException,因为imageurl仅被声明但未初始化。所以在顶部更改:

URL imageurl=null

希望这有效。祝你好运。

答案 1 :(得分:1)

为了完整起见:

在您的代码中,您忽略了如果您需要处理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拒绝编译代码并且您通过IDE帮助程序方法添加了auto-try / catch块。