Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 异步任务的崩溃报告_Android_Android Asynctask_Bitmapfactory - Fatal编程技术网

Android 异步任务的崩溃报告

Android 异步任务的崩溃报告,android,android-asynctask,bitmapfactory,Android,Android Asynctask,Bitmapfactory,我在Google Play上收到一个应用程序的崩溃报告。我使用asynctask来获取映像,它在我测试的每个设备上都能工作,但有些用户对此有问题。这真的很少见,但我需要调试和修复它。这是doInBackground方法: public class MetaTask extends AsyncTask<Void, Void, Void> { URL imageurl; @Override protected Void doInBackground(Void..

我在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;
    }
出于某种原因,我在考虑变量imageurl不是实际的url,我唯一能想到的是检查提取的字符串变量是否包含“http”和“jpg”,如果不存在,则使用Flurry存储此信息

在执行asynctask之前,会对internet连接的可用性进行检查,因此不会导致此问题

有人能想到其他原因吗?以下是我对碰撞报告的完整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

如果您在以下方面遇到异常,该怎么办:

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


希望这能奏效。祝你好运。

为了完整起见:

在您的代码中,您忽略了异常,如果您需要使用在
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;
    }
}
公共类元任务扩展了异步任务{
URL-imageurl;
@凌驾
受保护的Void doInBackground(Void…参数){
试一试{
doc=Jsoup.connect(data.get();
Elements meta=doc.select(“meta[property=og:image]”;
for(元素:meta){
提取=element.attr(“内容”);
}
imageurl=新URL(已提取);
位图=BitmapFactory.decodeStream(imageurl.openConnection()
.getInputStream());
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
//通知用户发生IO错误
}捕获(格式错误){
//TODO自动生成的捕捉块
e、 printStackTrace();
//通知用户URL无效
}捕获(例外e){
//忽略所有其他错误…除非你知道自己在做什么,否则可能不是个好主意
}
返回null;
}
}
一旦出现
异常
,此代码将立即退出,并且在
try/catch
块中,假定一切正常


您应该学习如何正确处理异常,而不是忽略异常,因为Eclipse拒绝编译您的代码,并且您通过IDE帮助器方法添加了一个自动try/catch块

如果将imageURl记录在try块中,它是否为null?是的,我可以使用Flurry来尝试。问题是,我在9台设备上进行了测试。它总是有效的,但这些都是来自用户。您的错误来自滥用try/catch来抑制/忽略异常。不应忽略异常,而应处理异常。当一个异常发生在某个点(在您的情况下是
imageUrl
)并且需要该值时,将停止整个块的执行。您不应执行依赖于try/catch中的变量/对象的代码,因为您抑制了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;
    }
}