2014-01-16 60 views
0

我有一個成員變量:String message = null;設置一個字符串,登錄串,空指針

這是一個有兩個Log.d()語句的異步任務。

private class LoadFromWeb extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected Void doInBackground(Void... params) { 
     Ion.with(MyActivity.this, 
       "http://example.com/api/?post=1_15_2014&json=1") 
       .asJsonObject() 
       .setCallback(new FutureCallback<JsonObject>() { 
        @Override 
        public void onCompleted(Exception e, JsonObject result) { 
         if (result == null) { 
          return; 
         } 

         JsonObject jsonCustomFields = result 
           .getAsJsonObject("post").getAsJsonObject(
             "custom_fields"); 

         String jsonMessage = jsonCustomFields 
           .getAsJsonArray("message").get(0) 
           .toString(); 


         message = jsonMessage; 
           Log.d("me", message); //Output: "Hello World" 


        } 
       }); 
     return null; 
    } 

    @Override 
    public void onPostExecute(Void arg0) { 
     Log.d("me", message); //NULL POINTER EXCEPTION 

    } 
    } 

我不知道爲什麼它這樣做,我沒有觸及其他地方的成員變量。我沒有想法。

確切的錯誤是:

01-16 00:31:25.360: E/AndroidRuntime(17807): java.lang.NullPointerException: println needs a message 

更新:

public class MyActivity extends SherlockListActivity { 

    SharedPreferences prefs; 
    private DatabaseHelper db = null; 
    TextView myView; 
    String message = null; 
+0

聲明'String message'的地方。 messge爲null @'Log.d(「me」,message);' – Raghunandan

+0

更新我的問題以顯示String消息被聲明爲該類的成員變量。 – EGHDK

+1

將'String message = null;'改爲'String message =「」;' –

回答

1

你創建你的doInBackground方法內的另一個異步任務。所以流程如下:調用doInBackground,在其內部創建一個新的異步任務ION.with(但不一定在當時執行),並且doInBackground返回null。所以內部異步任務中的代碼可能會在其他任何事情之後執行。

0

當您使用日誌,請這樣定義你將永遠不會得到NullPointerException異常

Log.e("me", "is:"+message); 
0

嘗試像這

Log.d("me", "value : " +message); 

即使值爲null它顯示日誌。它不會造成NPE

0

字符串消息被設置在這條線上

message = jsonMessage; 

而在此之前的消息是null。所以如果resultnull以下行

if (result == null) { 
    return; 
} 

然後返回。所以在onPostexecute消息是空的,從而得到異常。

1

ION本身是一個異步網絡庫。在Asynctask中撥打Ion意味着您在Asynctask內呼叫另一個Asynctask。那就是問題所在。如果您在return null;doInBackground方法之前使用Log.d("me", message);,您也可以獲得NPE。

不要使用帶有Ion的Asynctask。使用下面的代碼將做離子爲你

Ion.with(MyActivity.this, 
       "http://example.com/api/?post=1_15_2014&json=1") 
       .asJsonObject() 
       .setCallback(new FutureCallback<JsonObject>() { 
        @Override 
        public void onCompleted(Exception e, JsonObject result) { 
         if (result == null) { 
          return; 
         } 

         JsonObject jsonCustomFields = result 
           .getAsJsonObject("post").getAsJsonObject(
             "custom_fields"); 

         String jsonMessage = jsonCustomFields 
           .getAsJsonArray("message").get(0) 
           .toString(); 


         message = jsonMessage; 
           Log.d("me", message); //Output: "Hello World" 


        } 
       }); 

onCompleted所需的一切是一樣onPostExecuteAsynctask