2014-07-04 54 views
1

這是我的情況。我有這樣的AsyncTask:AsyncTask nullPointerException後退按鈕

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) 

這是因爲活動的結果是空的,我想。我能做什麼?

+2

你的問題是在適配器的構造函數。 – Blackbelt

+0

您的AsynchTask正在後臺運行,但您的活動已完成,因此它是空的。 –

+0

適配器工作正常..一切正常..只有當我退出應用程序才完成 –

回答

2

基本上,你必須把onPostExecute()的代碼裏面,如果(getActivity()!= NULL)...,以防止類似的旋轉屏的情況下..

但是,在你開始你的AsyncTask執行()?你必須尊重片段的生命週期...例如,你應該把它的Fragment.onActivityCreated() OR Fragment.onResume() ..NOT在Fragment.onCreate()因爲此時活動尚未附加。因此,getActivity()將始終爲NULL

+1

完美!現在我試試!非常感謝你 –

+0

它的工作原理!謝謝!! –

+0

很高興幫助!祝你好運! –

-1

這將幫助ü..

如果(空!= getActivity){// 粘貼我們的代碼

}

+0

在onPostExecute()?像'if(null!= getActivity){ParsingAdapterCategorie adapter = new ParsingAdapterCategorie(getActivity(),titoli,bitmap,data); lista.setAdapter(adapter); }'? –

+0

在每個asyncTask onpost執行中,你必須檢查活動是否存在。如果活動不存在,它會崩潰。 – user2851150

0

取消它的onDestroy

@Override 
public void onDestroy() { 
    if (asynchtask!=null) { 
     asynchtask.cancel(true); 
    } 
    super.onDestroy(); 
} 
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); 

    } 
} 

然後,你可以打電話給你的AsyncTask的活動如下:

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

希望這會解決您的問題! ;-)

此致敬禮。

+0

mmh,即使它是片段而不是活動? –

+0

是的,即使你在片段中調用它,它也可以工作。但不要在onCreate()方法中調用它。相反,你應該把代碼放在片段的onActiviyCreated()方法中。 – Robin