我有一个成员变量: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 :(得分:1)
ION本身就是一个异步网络库。在Ion
中拨打Asynctask
表示您正在Asynctask
内拨打另一个Asynctask
。那就是问题所在。如果您在Log.d("me", message);
方法的return null;
行之前使用doInBackground
,那么您也会获得NPE。
不要将Asynctask
与Ion一起使用。使用以下代码将完成您所需的一切
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"
}
});
Ion中的 onCompleted
与onPostExecute
Asynctask
相同
答案 1 :(得分:1)
您正在doInBackground
方法中创建另一个异步任务。所以流程就是这样:doInBackground
被调用,在其中用ION.with
创建一个新的异步任务(但不一定在那一刻执行),doInBackground
返回null。因此,内部异步任务中的代码可以在其他所有内容之后执行。
答案 2 :(得分:0)
当你使用日志时,请按照这样定义,你永远不会得到nullpointerexception
Log.e("me", "is:"+message);
答案 3 :(得分:0)
试试这个
Log.d("me", "value : " +message);
即使值null也显示日志。它不会导致NPE
答案 4 :(得分:0)
字符串消息在此行中设置
message = jsonMessage;
但在此之前消息为null
。因此,如果以下行中的result
为null
if (result == null) {
return;
}
然后它被退回。因此,onPostexecute消息为null,从而获得异常。