1

我是data=nullandroid的新手。我在执行正确的onPostExecute时得到了。现在我只想显示一个没有可用数据的对话框。但是我得到了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);
             }

        }

这是我的 Logcat,它显示了该过程的完整日志:

07-23 12:22:55.976: I/finalAnswer(25159): ["a@hotmail.com","c@hotmail.com","b@hotmail.com"]
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;
}


}
4

5 回答 5

0

这需要调试器。要么doInBackground不被调用(这不太可能),要么你ParseJSONForUserAdminChats返回 null。我的赌注是后者。

于 2012-07-22T18:19:26.567 回答
0

解决您的异常的一个简单方法是将行更改为:

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

我认为原因datanull(而不是空的)是因为HandleJSON.ParseJsonForUserAdminChats()正在返回null。(请注意,new您在此之前所做的事情既不需要也没有帮助,顺便说一句。)

于 2012-07-22T18:23:28.227 回答
0

好吧,我确定这不是您的真实代码。无论如何,如果你可以让它运行并得到这个异常,你不能用 try catch 来处理它吗?也许您的方法“HandleJSON.ParseJsonForUserAdminChats”正在使对象无效,并且 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
}
于 2012-07-22T18:24:00.130 回答
0

你没有AsyncTask正确使用。如果您阅读本文档中称为AsyncTask 的泛型类型的部分,您将了解如何使用泛型类型在和之间传递数据。这是您需要做的: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

于 2012-07-22T18:47:20.777 回答
0

if(!data.isEmpty())
这与数据无关!这是关于结果的。所有返回数据都存储在结果中。

于 2012-08-18T09:05:05.980 回答