2013-10-14 111 views
1

我想从我的AsyncTask.OnPostExecute传递一些JSONObject数据到我的MainActivity.JSONCallBackComplete。Android的AsyncTask活动回调nullPointerException

我的问题是,当我试图检查我传递回的JSONObject我得到以下execption:

10-14 18:40:25.820: E/AndroidRuntime(4153): FATAL EXCEPTION: main 
10-14 18:40:25.820: E/AndroidRuntime(4153): java.lang.NullPointerException 
10-14 18:40:25.820: E/AndroidRuntime(4153):  at com.icerge.revivaltimes.MainActivity.JSONCallBackComplete(MainActivity.java:31) 
10-14 18:40:25.820: E/AndroidRuntime(4153):  at com.icerge.revivaltimes.JsonObj.onPostExecute(JsonObj.java:70) 
10-14 18:40:25.820: E/AndroidRuntime(4153):  at com.icerge.revivaltimes.JsonObj.onPostExecute(JsonObj.java:1) 
10-14 18:40:25.820: E/AndroidRuntime(4153):  at android.os.AsyncTask.finish(AsyncTask.java:417) 
10-14 18:40:25.820: E/AndroidRuntime(4153):  at android.os.AsyncTask.access$300(AsyncTask.java:127) 
10-14 18:40:25.820: E/AndroidRuntime(4153):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429) 
10-14 18:40:25.820: E/AndroidRuntime(4153):  at android.os.Handler.dispatchMessage(Handler.java:99) 
10-14 18:40:25.820: E/AndroidRuntime(4153):  at android.os.Looper.loop(Looper.java:144) 
10-14 18:40:25.820: E/AndroidRuntime(4153):  at android.app.ActivityThread.main(ActivityThread.java:4937) 
10-14 18:40:25.820: E/AndroidRuntime(4153):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-14 18:40:25.820: E/AndroidRuntime(4153):  at java.lang.reflect.Method.invoke(Method.java:521) 
10-14 18:40:25.820: E/AndroidRuntime(4153):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
10-14 18:40:25.820: E/AndroidRuntime(4153):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
10-14 18:40:25.820: E/AndroidRuntime(4153):  at dalvik.system.NativeStart.main(Native Method) 

我的MainActivity类别如下:

public class MainActivity extends Activity{ 

     private JSONObject jsonData = null; 

     public void JSONCallBackComplete(JSONObject jsonData){ 
      this.jsonData = jsonData; 
      Log.e("TESTing in callback: ", jsonData.toString() ); 
     } 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 

      new JsonObj(this).execute("http://myserver/json"); 
     } 
    } 

而我的AsyncTask类是如如下:

public class JsonObj extends AsyncTask<String, Void, JSONObject>{ 
    MainActivity activity; 
    int tid; 
    String term; 

    public JsonObj(MainActivity activity){ 
     this.activity = activity; 
//  Log.e("TESTING: ", activity.getClass().toString()); 
    } 

    @Override 
    protected JSONObject doInBackground(String... url) { 
     // TODO Auto-generated method stub 
     DefaultHttpClient httpclient = new DefaultHttpClient(new BasicHttpParams()); 
     HttpPost httppost = new HttpPost(url[0]); 
     JSONObject jsonObject = null; 
     // Depends on your web service 
     httppost.setHeader("Content-type", "application/json"); 

     InputStream inputStream = null; 
     String result = null; 
     try { 
      HttpResponse response = httpclient.execute(httppost);   
      HttpEntity entity = response.getEntity(); 

      inputStream = entity.getContent(); 
      // json is UTF-8 by default 
      BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8); 
      StringBuilder sb = new StringBuilder(); 

      String line = null; 
      while ((line = reader.readLine()) != null){ 
       sb.append(line + "\n"); 
      } 
      result = sb.toString(); 
      Log.e("JSON-Test [RESULT]: ", result); 
      jsonObject = new JSONObject(result); 
     } catch (Exception e) { 
      Log.e("JSON-Test [exception]: ", e.toString()); 
     } 
     finally { 
      try{if(inputStream != null)inputStream.close();}catch(Exception squish){} 
     } 

     return jsonObject; 
    } 

    @Override 
protected void onPostExecute(JSONObject result) { 
    // TODO Auto-generated method stub 
    super.onPostExecute(result); 
    if(!result.equals(null)){ 
     this.activity.JSONCallBackComplete(result); 
    } 
} 
} 

我有一个构造函数在AsyncTask中指定MainActivity -Context并使用它通过JSONObject参数调用我的JSONCallBackComplete反馈函数。

但是,我没有显示我的JSON-DATA,而是得到了上面粘贴的异常。

+0

在我看来,'MainActivity'的第31行是空的,你确定你的jsonData对象在返回时不是null? – tyczj

+0

'onPostExecute()'中的'result''null'? – codeMagic

+0

我已经在两个相关位置执行了'.equals(NULL)'检查,但是空指针异常仍然存在。我的代码已更新以显示onPostExecute函数中的检查 – sisko

回答

1

您有NullPointerException s。第一个我看到的就是从这里

if(!result.equals(null)){ 

未来这实际上应该是

if (result != null) { 

你真的不应该使用.equals()来比较null,因为.equals()通常实施检查2个对象的人类感知值是相同的,而不是内存地址。当你想与null内存地址进行比较时,只需使用直接==!=,其中Java将为你比较地址(你想要的)。

+0

谢谢。我相应地更正了我的结果检查,但是我的if语句没有发射。这可能意味着没有数据从我的doInBackground函数发送或其他东西 - 其他我没有看到 – sisko

+0

这很可能是您的网络请求失败。查看完成后添加到您的StringBuilder的“sb”。 – bclymer

+0

doInBackground函数中的字符串生成器具有从服务器获取的所有数据。它正确地打印JSON数据 – sisko