2012-07-22 112 views
0

我是android.I的新手,在執行onPostExecute時正在獲取data=null,這是正確的。現在我只想顯示一個沒有數據可用的對話框。但是我得到了NullPointerExceptionAsyncTask中的NullPointerException OnPostExecute

public class GetPreviousChatNewThread extends AsyncTask<Void,Void,Void> { 

      ProgressDialog dialog; 
      ArrayList<HashMap<String,String>> data; 

      @Override 
      protected Void doInBackground(Void... void1) { 
       data=new ArrayList<HashMap<String,String>>(); 
       data=HandleJSON.ParseJsonForUserAdminChats(sendHttpRequest(
         "ReturnUserAdminChats", 
         "admin", 
         "You" , 
         "a", 
         clientEmail, 
         UserAdminChatActivity.LastShowingChatDate)); 
       return null; 
      } 

      @Override 
      protected void onPostExecute(Void result) { 

       super.onPostExecute(result); 


       if(!data.isEmpty())  // <-- error here 
       { 
        adapter.InsertValuesAtTop(data); 
       } 
       else 
       { 
        Toast.makeText(getApplicationContext(), "No more data", Toast.LENGTH_LONG).show(); 
       } 
       if(dialog.isShowing()) 
       dialog.dismiss(); 

      } 

      @Override 
      protected void onPreExecute() { 
       dialog = ProgressDialog.show(UserAdminChatActivity.this, "", "Loading. Please wait...", true); 
      } 

     } 

這裏是我的logcat這顯示了該過程的完整的日誌:

07-23 12:22:55.976: I/finalAnswer(25159): ["[email protected]","[email protected]","[email protected]"] 
07-23 12:23:01.101: I/finalAnswer(25159): [{"username":"moji","chatText":"jingalala hu","chatDate":"4\\July\\2012"},{"username":"You","chatText":"bingalala hu","chatDate":"4\\July\\2012"},{"username":"moji","chatText":"jingalala hu","chatDate":"4\\July\\2012"}] 
07-23 12:23:01.101: I/GoTo Json(25159): [{"username":"moji","chatText":"jingalala hu","chatDate":"4\\July\\2012"},{"username":"You","chatText":"bingalala hu","chatDate":"4\\July\\2012"},{"username":"moji","chatText":"jingalala hu","chatDate":"4\\July\\2012"}] 
07-23 12:23:01.101: I/dateeeeeee(25159): 4\July\2012 
07-23 12:23:01.101: I/dateeeeeee(25159): 4\July\2012 
07-23 12:23:01.111: I/dateeeeeee(25159): 4\July\2012 
07-23 12:23:01.161: I/finalAnswer(25159): new"[]" 
07-23 12:23:02.603: I/finalAnswer(25159): [] 
07-23 12:23:02.603: I/GoTo Json(25159): [] 
07-23 12:23:02.613: D/AndroidRuntime(25159): Shutting down VM 
07-23 12:23:02.613: W/dalvikvm(25159): threadid=1: thread exiting with uncaught exception (group=0x4001d578) 
07-23 12:23:02.623: E/AndroidRuntime(25159): FATAL EXCEPTION: main 
07-23 12:23:02.623: E/AndroidRuntime(25159): java.lang.NullPointerException 
07-23 12:23:02.623: E/AndroidRuntime(25159): at com.app.ServerClient.UserAdminChatActivity$GetPreviousChatNewThread.onPostExecute(UserAdminChatActivity.java:197) 
07-23 12:23:02.623: E/AndroidRuntime(25159): at com.app.ServerClient.UserAdminChatActivity$GetPreviousChatNewThread.onPostExecute(UserAdminChatActivity.java:1) 
07-23 12:23:02.623: E/AndroidRuntime(25159): at android.os.AsyncTask.finish(AsyncTask.java:417) 
07-23 12:23:02.623: E/AndroidRuntime(25159): at android.os.AsyncTask.access$300(AsyncTask.java:127) 
07-23 12:23:02.623: E/AndroidRuntime(25159): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429) 
07-23 12:23:02.623: E/AndroidRuntime(25159): at android.os.Handler.dispatchMessage(Handler.java:99) 
07-23 12:23:02.623: E/AndroidRuntime(25159): at android.os.Looper.loop(Looper.java:138) 
07-23 12:23:02.623: E/AndroidRuntime(25159): at android.app.ActivityThread.main(ActivityThread.java:3701) 
07-23 12:23:02.623: E/AndroidRuntime(25159): at java.lang.reflect.Method.invokeNative(Native Method) 
07-23 12:23:02.623: E/AndroidRuntime(25159): at java.lang.reflect.Method.invoke(Method.java:507) 
07-23 12:23:02.623: E/AndroidRuntime(25159): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878) 
07-23 12:23:02.623: E/AndroidRuntime(25159): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636) 
07-23 12:23:02.623: E/AndroidRuntime(25159): at dalvik.system.NativeStart.main(Native Method) 

編輯:

繼承人爲HandleJson代碼:

public class HandleJSON { 

private static ArrayList<HashMap<String,String>> chat; 
static final String Key_username="username_key"; 
static final String Key_email="email_key"; 
static final String Key_messageText="messageText_key"; 
static final String Key_messageDate="messageDate_key"; 
static final String Key_messageCounts="messageCount_key"; 
static boolean newObject; 

public static ArrayList<HashMap<String,String>> ParseJsonForLatestChats(String jsonData) 
{ 
     try { 

      if(HandleJSON.newObject) 
      { 
       chat=new ArrayList<HashMap<String,String>>(); 
      } 
      Log.i("jsonReturned",jsonData.toString()); 
      JSONArray jsonarr=new JSONArray(jsonData); 
      for(int i=0;i<jsonarr.length();i++) 
      { 
       HashMap<String,String> hashMap=new HashMap<String,String>(); 

       hashMap.put(HandleJSON.Key_username, jsonarr.getJSONObject(i).getString("username")); 
       hashMap.put(HandleJSON.Key_email, jsonarr.getJSONObject(i).getString("email")); 
       hashMap.put(HandleJSON.Key_messageCounts, jsonarr.getJSONObject(i).getString("count")); 

       chat.add(hashMap); 

      } 

      return chat; 
     } 
     catch(JSONException e) 
     { 
      Log.e("JsonDek", e.getMessage()); 
      return null; 
     } 
} 

public static ArrayList<HashMap<String,String>> ParseJsonForUserAdminChats(String jsonData) 
{ 

     chat=new ArrayList<HashMap<String,String>>(); 

try { 

     JSONArray jsonarr=new JSONArray(jsonData); 
     Log.i("GoTo Json",jsonData); 
      UserAdminChatActivity.LastShowingChatDate=jsonarr.getJSONObject(0).getString("chatDate"); 
      for(int i=jsonarr.length()-1;i>=0;i--) 
      { 
       HashMap<String,String> hashMap=new HashMap<String,String>(); 

       hashMap.put(HandleJSON.Key_username, jsonarr.getJSONObject(i).getString("username")); 
       hashMap.put(HandleJSON.Key_messageText, jsonarr.getJSONObject(i).getString("chatText")); 
       hashMap.put(HandleJSON.Key_messageDate, jsonarr.getJSONObject(i).getString("chatDate")); 
       Log.i("dateeeeeee",jsonarr.getJSONObject(i).getString("chatDate")); 

       chat.add(hashMap); 

      } 


      return chat; 
     } 
     catch(JSONException e) 
     { 
      return null; 
     } 
} 


public static ArrayList<String> ReturnUsersEmail(String jsonData) throws JSONException 
{ 
    JSONArray jsonarr=new JSONArray(jsonData); 
    ArrayList<String> emails=new ArrayList<String>(); 

    for(int i=0;i<jsonarr.length();i++) 
    { 
     emails.add(jsonarr.getString(i)); 
    } 

    return emails; 
} 


} 

回答

1

您沒有正確使用AsyncTask。 如果您閱讀AsyncTask的通用類型部分this document,您將學習如何使用通用類型在doInBackgroundonPostExecute之間傳遞數據。 以下是你需要做什麼:

public class GetPreviousChatNewThread extends AsyncTask<Void,Void,List<HashMap<String, String>>> { 

     ProgressDialog dialog; 

     @Override 
     protected List<HashMap<String, String>> doInBackground(Void... void) { 
      return HandleJSON.ParseJsonForUserAdminChats(sendHttpRequest(
        "ReturnUserAdminChats", 
        "admin", 
        "You" , 
        "a", 
        clientEmail, 
        UserAdminChatActivity.LastShowingChatDate)); 
     } 

     @Override 
     protected void onPostExecute(List<HashMap<String, String>> result) { 
      super.onPostExecute(result); 
      if(null != result && !result.isEmpty()) { //checks not null or empty 
       adapter.InsertValuesAtTop(result); 
      } 
      else 
      { 
       Toast.makeText(getApplicationContext(), "No more data", Toast.LENGTH_LONG).show(); 
      } 
      if(dialog.isShowing()) 
      dialog.dismiss(); 

     } 

     @Override 
     protected void onPreExecute() { 
      dialog = ProgressDialog.show(UserAdminChatActivity.this, "", "Loading. Please wait...", true); 
     } 

    } 

如果你得到一個Toast,那麼你知道通過HandleJSON.ParseJsonForUserAdminChats(...)將返回null或空List返回的數據。

+0

hey thnx的答覆。我試過的代碼,但它仍然給出了同樣的錯誤。 – Mj1992 2012-07-22 18:56:58

+0

我嚴重懷疑它。有**沒有辦法**你在'if(null!= result &&!result.isEmpty())'收到一個NPE。這裏最有可能的情況是你在'HandleJSON.ParseJsonForUserAdminChats'中獲得了一個NPE。你可以發佈該代碼嗎?也許我們可以幫助你在那裏找到問題。 – 2012-07-22 19:03:50

+0

我編輯了問題 – Mj1992 2012-07-22 19:14:25

0

這需要一個調試器。 doInBackground不會被調用(這是不可能的非常),或者您的ParseJSONForUserAdminChats返回null。我打賭的是後者。

+0

是的,它是返回null,因爲我已經提到的問題,這就是正確的現在我只是想表明,沒有數據給用戶 – Mj1992 2012-07-22 18:28:48

0

一個簡單的辦法解決您的例外是將行更改爲:

if (null != data && !data.isEmpty()) 

我想原因datanull(而不是空的)還有是因爲HandleJSON.ParseJsonForUserAdminChats()將返回null。 (請注意,你之前做的new不需要也沒有幫助,順便說一句。)

+0

是的,你是正確的它返回hashmaps arraylist但由於沒有數據那裏所以它返回null – Mj1992 2012-07-22 18:26:12

+0

我試過你說的,但它仍然給出相同的錯誤 – Mj1992 2012-07-22 18:27:51

+0

@ Mj1992它在同一行上給出一個空指針異常?如果數據真的是'空',那不應該是這種情況。我很茫然。 – Turix 2012-07-22 18:34:53

0

嗯,我相信這不是你真正的代碼。 無論如何,如果你能做到這一點,運行並得到這個異常,你不能用try catch來處理它嗎? 也許你的方法「HandleJSON.ParseJsonForUserAdminChats」將null對象和isEmpty只處理如果列表中沒有元素和不處理,如果變量爲null。

try { 
    if(!data.isEmpty()) { 
    //if data is not null and not empty will pass here 
    } 
} catch(NullPointerException e) { 
    //If data == null it will pass here 
} 
+0

那麼我怎樣才能處理空列表,你可以解釋一下嗎? – Mj1992 2012-07-22 18:29:42

+0

你可以像Turix一樣查看,或者像使用mu post中的編輯那樣處理它。 – 2012-07-22 18:35:39

0

if(!data.isEmpty())
這不是數據!這是關於結果。所有返回數據都存儲在結果中。

相關問題