AsyncTask nullPointerException按下后退按钮

时间:2014-07-04 12:48:38

标签: java android android-asynctask android-arrayadapter

这是我的情况。我有这个AsyncTask:

private class Logo extends AsyncTask<Void, Void, Void> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute(); 
        }

        @Override
        protected Void doInBackground(Void... params) {

            try {
                // Connect to the web site
                Document document = Jsoup.connect(BLOG_URL).get();
                // Using Elements to get the class data 
                // Locate the src attribute
                for(Element img : document.select("div.col-1-1 .image img[src]")) {
                    String ImgSrc = img.attr("src");
                    // Download image from URL
                    InputStream is = new java.net.URL(ImgSrc).openStream();
                    //add Bitmap to an array
                    bitmap.add(BitmapFactory.decodeStream(is));
                 }
            } catch (IOException e) {
                e.printStackTrace();
                Log.e("ESEMPIO", "ERRORE NEL PARSING DELLE IMMAGINI");
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {

            ParsingAdapterCategorie adapter = new ParsingAdapterCategorie(getActivity(), titoli, bitmap, data);
            lista.setAdapter(adapter);

        }
    }

如果按下后退按钮,它会崩溃并出现日志错误,如:

FATAL EXCEPTION: main
java.lang.NullPointerException
at android.widget.ArrayAdapter.init(ArrayAdapter.java:310)
at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:166)

这是因为我认为活动结果为空。我该怎么办?

5 个答案:

答案 0 :(得分:2)

基本上你必须将onPostExecute()的代码放在if(getActivity()!= null)...中以防止像旋转屏幕这样的情况..

但是你在哪里开始你的AsyncTask execute()?你必须尊重片段的生命周期...例如,你应该在 Fragment.onActivityCreated() Fragment.onResume()上调用它。 Fragment.onCreate() 因为此时尚未附加活动..因此getActivity()将始终为 NULL

答案 1 :(得分:0)

在onDestroy中取消它

@Override
public void onDestroy() {
    if (asynchtask!=null) {
        asynchtask.cancel(true);
    }
    super.onDestroy();
}

答案 2 :(得分:0)

您可能需要使用 IntentService

,而不是使用 AsyncTask

把它拿出来

http://developer.android.com/training/run-background-service/create-service.html

答案 3 :(得分:0)

活动结束时,AsyncTask在后台运行。所以getActivity()返回null。您必须按如下所示更改代码,并在AsyncTask的构造函数中传递上下文。

private class Logo extends AsyncTask<Void, Void, Void> {
    private Context context;

    public Logo(Context context) {
        this.context = context;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute(); 
    }

    @Override
    protected Void doInBackground(Void... params) {

        try {
            // Connect to the web site
            Document document = Jsoup.connect(BLOG_URL).get();
            // Using Elements to get the class data 
            // Locate the src attribute
            for(Element img : document.select("div.col-1-1 .image img[src]")) {
                String ImgSrc = img.attr("src");
                // Download image from URL
                InputStream is = new java.net.URL(ImgSrc).openStream();
                //add Bitmap to an array
                bitmap.add(BitmapFactory.decodeStream(is));
             }
        } catch (IOException e) {
            e.printStackTrace();
            Log.e("ESEMPIO", "ERRORE NEL PARSING DELLE IMMAGINI");
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {

        ParsingAdapterCategorie adapter = new ParsingAdapterCategorie(context, titoli, bitmap, data);
        lista.setAdapter(adapter);

    }
}

然后您可以按如下方式调用Activity中的AsyncTask:

    Logo logo = new Logo(this);
    logo.execute();

希望这能解决你的问题! ; - )

最好的问候。

答案 4 :(得分:-1)

这将有助于你..

if(null!= getActivity){ //粘贴你的代码

}