2014-07-02 31 views
0

我有一個啓動畫面,運行從API下載數據的asyncTask。在該任務的OnPostExecute上,我運行下一個asyncTask發送存儲的電子郵件。一旦完成,我需要一個AlertDialog彈出一個確定的按鈕,以便用戶知道下載完成。我用這太問題得到儘可能我:爲什麼我會在asyncTask中使用AlertDialog獲取NullPointerException?

Android AlertDialog inside AsyncTask

現在我得到一個NullPointerException當我嘗試添加屬性對話框:

public class JSONParser extends AsyncTask<String, String, JSONObject> { 
    Context c; 

    public JSONParser(int api,Context c) { 
      this.api= api; 
      this.c = c; 
    } 
    ... 
    protected void onPostExecute(JSONObject result) { 
      JSONObject output = new JSONEmailParser(c).executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, new String[] {null,null,null,null}).get(); 
    } 
} 

public class JSONEmailParser extends AsyncTask<String, String, JSONObject> { 
    Context c; 

    AlertDialog.Builder builder; 

    public JSONEmailParser(Context c){ 
      this.c = c; 
    } 

    protected void onPreExecute(int api){ 
      builder = new AlertDialog.Builder(SplashScreen.this); 
    } 

    ... 

    protected void onPostExecute(JSONObject result) { 
      setLastUpdate(); 

      builder.setTitle("Sales Toolkit"); 
      builder.setCancelable(false); 
      builder.setMessage("Download Complete"); 
      builder.setPositiveButton("Continue", new DialogInterface.OnClickListener() { 

       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        // TODO Auto-generated method stub 
        dialog.dismiss(); 
        endSplash(); 
       } 
      }); 
      builder.show(); 

     } 
} 

錯誤來了builder.setTitle("Sales Toolkit");

+0

您應該始終使用@Override註釋。它有助於捕捉這樣的錯誤。 – JDJ

回答

-1

好像onPreExecute()方法沒有被調用。如果你不真正需要的onPostExecute()方法之前使用builder任何地方,我會建議只是移動

builder = new AlertDialog.Builder(SplashScreen.this); 

onPostExecute()方法。

5

AsyncTask#onPreExecute()不接受int參數。由於您的方法簽名錯誤,因此可能永遠不會被調用,因此從未設置builder。這是爲什麼你應該使用@Override註釋的典型例子。

+0

我在上面的例子中使用了'onPreExecute()'中的那個int,因爲它不涉及這個問題。 – dcp3450

+0

這是一個很好的抓住@Brodo!而@dcp如果沒有被調用,那麼這是一個問題。 – greenapps

+0

它不只是與問題有關,它*是問題。 –

0

不要使用.get()來執行AsyncTask,因爲它不再是異步的。並且onPreExcute不會被調用?

相關問題