2012-07-22 2 views
0

나는 android.new에 새로 왔습니다. 정확한 onPostExecute를 실행할 때 data=null을 얻었습니다. 지금은 데이터가 없습니다라는 대화 상자를 보여주고 싶습니다. 그러나 NullPointerException을 얻고 있습니다. AsyncTask의 NullPointerException

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); 
      } 

     } 

다음은 프로세스의 전체 로그를 보여줍니다 내 로그 캣입니다 :

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에 대한

을 Heres 코드 : 이것은 디버거를 요구

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을 올바르게 사용하고 있지 않습니다. 당신이 this documentAsyncTask를의 일반적인 유형이라는 섹션을 읽어 경우 doInBackgroundonPostExecute 사이에 데이터를 전달하는 일반적인 유형을 사용하는 방법을 배우게됩니다. 당신이 Toast을받을 수 있나요 경우에 당신이 HandleJSON.ParseJsonForUserAdminChats(...)null 또는 빈 List을 반환 반환하는 데이터를 알고,

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); 
     } 

    } 

을 : 여기 은 당신이해야 할 것입니다.

+0

안녕하세요 thnx reply.I 코드를 시도했지만 여전히 동일한 오류가 발생합니다. – Mj1992

+0

나는 그것을 심각하게 의심한다. ** if (null! = result &&! result.isEmpty())'에서 NPE를받는 방법은 없습니다 ** **. 여기서 가장 가능성있는 시나리오는 'HandleJSON.ParseJsonForUserAdminChats' 안에 NPE를 가져 오는 것입니다. 그 코드를 게시 할 수 있습니까? 어쩌면 문제를 찾을 수 있도록 도울 수 있습니다. –

+0

질문을 편집했습니다 – Mj1992

0

. doInBackground이 호출되지 않습니다 (즉 은 매우). ParseJSONForUserAdminChats은 null을 반환합니다. 나의 내기는 후자에있다.

+0

네 답답해. 질문에 언급했듯이 정확하다. 나는 단지 사용자에게 아무 데이터도 없다는 것을 보여주고 싶다. – Mj1992

0

당신의 예외에 대한 쉬운 수정에 줄을 변경하는 것입니다 :

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

나는 이유 data가 (대신 빈의) HandleJSON.ParseJsonForUserAdminChats()null를 반환하기 때문에이 null 생각합니다. (그 전에는 그럴 필요가 없거나 도움이되는 new이 필요합니다.)

+0

네가 맞다. 해시 맵의 arraylist를 돌려 준다.하지만 거기에는 데이터가 없다. 그것은 null을 반환합니다 – Mj1992

+0

당신이 말한 것을 시도했지만 여전히 동일한 오류가 발생했습니다 – Mj1992

+0

@ Mj1992 그것은 같은 줄에 널 포인터 예외를 제공합니까? 데이터가 실제로 'null'인 경우, 그렇게해서는 안됩니다. 나는 잃어 버렸다. – Turix

0

음, 이것이 실제 코드가 아닙니다. 어쨌든 실행할 수 있고이 예외가 발생하면 try catch로 처리 할 수 ​​없습니까? 어쩌면 당신은 "HandleJSON.ParseJsonForUserAdminChats"메서드가 객체를 nullifing하고 list가 요소가없고 변수가 null 인 경우 isEmpty가 핸들을 처리하지 못할 수도 있습니다.

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

목록에 null을 처리하면 어떻게 설명 할 수 있습니까? – Mj1992

+0

Turix saied처럼 확인하거나 mu 게시물의 편집 내용을 사용하여 처리 할 수 ​​있습니다. –

0

if (! data.isEmpty())
데이터가 아닙니다. 그것은 결과에 관한 것입니다. 모든 반환 데이터는 결과에 저장됩니다.