2012-07-22 114 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())
这不是数据!这是关于结果。所有返回数据都存储在结果中。