2013-10-14 2 views
1

Я пытаюсь передать некоторые данные JSONObject обратно из моего AsyncTask.OnPostExecute в свой MainActivity.JSONCallBackComplete.Android AsyncTask-to-Activity callback 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 -Контекст и использовать его для вызова моей функции обратной связи JSONCallBackComplete с аргументом JSONObject.

Однако вместо отображения моих JSON-DATA я получаю исключение, которое я вставил выше.

+0

Мне кажется, что строка 31 «MainActivity» равна нулю, вы уверены, что ваш объект jsonData не имеет значения null, когда он туда возвращается? – tyczj

+0

Является 'результатом'' null' в 'onPostExecute()'? – codeMagic

+0

Я выполнил проверку «.equals (NULL)» в обоих соответствующих местах, но исключение nullpointer сохраняется. Мой код обновлен, чтобы показать проверку в функции onPostExecute – sisko

ответ

1

У вас есть NullPointerException s. Первый из них я вижу, идет отсюда

if(!result.equals(null)){ 

Это должно быть на самом деле

if (result != null) { 

Вы не должны действительно использовать .equals() для сравнения с null, потому что .equals() обычно выполняется, чтобы проверить, человеческие воспринимаемые значения двух объектов одинаковы, а не адрес памяти. Если вы хотите что-то сравнить с адресом памяти null, просто используйте прямой == или !=, где Java будет сравнивать адреса для вас (что вы хотите).

+0

Спасибо. Я скорректировал свою проверку результатов, но мой if-statement не стреляет. Вероятно, это означает, что никакие данные не отправляются из моей функции doInBackground или что-то еще, иначе я не вижу – sisko

+0

Вероятно, ваш сетевой запрос терпит неудачу. Посмотрите, что ваш StringBuilder 'sb' после завершения добавления к нему. – bclymer

+0

Строковый строитель в функции doInBackground имеет все данные, полученные с сервера. Он корректно печатает данные JSON – sisko