Java 在Android中设置字符串,记录字符串,空指针
我有一个成员变量:Java 在Android中设置字符串,记录字符串,空指针,java,android,nullpointerexception,Java,Android,Nullpointerexception,我有一个成员变量:stringmessage=null 这是一个包含两条Log.d()语句的异步任务 private class LoadFromWeb extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... params) { Ion.with(MyActivity.this, "http://exam
stringmessage=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
}
}
更新:
public class MyActivity extends SherlockListActivity {
SharedPreferences prefs;
private DatabaseHelper db = null;
TextView myView;
String message = null;
当您使用日志时,请这样定义,您将永远不会得到nullpointerexception
Log.e("me", "is:"+message);
像这样试试
Log.d("me", "value : " +message);
即使值为null,也会显示日志。它不会导致NPE字符串消息设置在此行中
message = jsonMessage;
但在此之前,消息为null
。因此,如果下一行中的结果
为null
if (result == null) {
return;
}
然后它被返回。因此,在onPostexecute中,消息为null,从而获得异常。本身就是一个异步网络库。在Asynctask
中调用Ion
表示您正在Asynctask
中调用另一个Asynctask
。这就是问题所在。如果您使用Log.d(“我”,消息)行前的code>返回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.with(MyActivity.this,
"http://example.com/api/?post=1_15_2014&json=1")
.asJsonObject()
.setCallback(新的FutureCallback(){
@凌驾
未完成公共无效(异常e,JsonObject结果){
如果(结果==null){
返回;
}
JsonObject jsonCustomFields=结果
.getAsJsonObject(“post”).getAsJsonObject(
“自定义字段”);
字符串jsonMessage=jsonCustomFields
.getAsJsonArray(“消息”).get(0)
.toString();
message=jsonMessage;
Log.d(“我”,消息);//输出:“你好,世界”
}
});
离子中的onCompleted
与Asynctask
的onPostExecute
相同。您正在doInBackground
方法中创建另一个异步任务。因此流程是这样的:doInBackground
被调用,在它里面用ION创建一个新的异步任务。因此,内部异步任务中的代码可以在执行其他所有操作之后执行。其中是字符串消息
声明。消息为空@Log.d(“me”,消息)
更新了我的问题,显示String message被声明为类的成员变量。changeString message=null代码>至字符串消息=”
您不是正在doInBackground
方法中创建另一个异步任务吗?因此流程是这样的:doInBackground
被调用,其中使用ION创建了一个新的异步任务。使用,doInBackground
返回null。因此,内部异步任务中的代码可能会在执行其他任务之后执行。我的想法是在后台使用离子。我认为这将是解决办法。我现在就去看看。
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"
}
});