我正在处理我的网络服务,我遇到了一个奇怪的问题,因为我是Android开发新手,所以无法解决这个问题。当我在异步任务的onPostExecute()
方法中显示toast时,我得到空指针异常。有人请帮我解决这个问题
if (result.booleanValue()) // here at this line I am getting the error in logcat//
提前致谢....!
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
///////////male female buttons code/////////////
Button regmalebtn = (Button) findViewById(R.id.regmalebtn);
regmalebtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
gender="M";
System.out.println("gender value after male button click ="+gender);
Log.v(TAG,"gender value on male button click ="+gender );
}
});
Button regfemalebtn = (Button)findViewById(R.id.regfemalebtn);
regfemalebtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
gender ="F";
// System.out.println("gender value on female button click ="+gender);
Log.v(TAG,"gender value on female button click ="+gender );
}
});
////////////male female button code will ends here/////////////
Button signin = (Button) findViewById(R.id.regsubmitbtn);
signin.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
new RegisterTask().execute();
};
});
}
private class RegisterTask extends AsyncTask<Void, Void, Boolean> {
private final ProgressDialog dialog = new ProgressDialog(Register.this);
protected void onPreExecute() {
this.dialog.setMessage("Registering...");
this.dialog.show();
}
// @SuppressWarnings("unused")
protected Boolean doInBackground(final Void unused) {
return this.register(); //don't interact with the ui!
}
private Boolean register() {
************some code for webservices************
}
return null;
}
protected void onPostExecute(final Boolean result) {
if (this.dialog.isShowing()) {
this.dialog.dismiss();
}
if (result.booleanValue()) {
// show register success dialog
// I m getting the error at above line
Toast.makeText(Register.this, "Registerd", Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(Register.this, "Try Again", Toast.LENGTH_SHORT).show();
}
}
@Override
protected Boolean doInBackground(Void... params) {
// TODO Auto-generated method stub
return register();
}
}
}
这些是logcat错误
06-28 16:55:56.685: WARN/dalvikvm(708): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
06-28 16:55:56.695: ERROR/AndroidRuntime(708): FATAL EXCEPTION: main
06-28 16:55:56.695: ERROR/AndroidRuntime(708): java.lang.NullPointerException
06-28 16:55:56.695: ERROR/AndroidRuntime(708): at com.soap.Register$RegisterTask.onPostExecute(Register.java:193)
06-28 16:55:56.695: ERROR/AndroidRuntime(708): at com.soap.Register$RegisterTask.onPostExecute(Register.java:1)
06-28 16:55:56.695: ERROR/AndroidRuntime(708): at android.os.AsyncTask.finish(AsyncTask.java:417)
06-28 16:55:56.695: ERROR/AndroidRuntime(708): at android.os.AsyncTask.access$300(AsyncTask.java:127)
06-28 16:55:56.695: ERROR/AndroidRuntime(708): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
06-28 16:55:56.695: ERROR/AndroidRuntime(708): at android.os.Handler.dispatchMessage(Handler.java:99)
06-28 16:55:56.695: ERROR/AndroidRuntime(708): at android.os.Looper.loop(Looper.java:123)
06-28 16:55:56.695: ERROR/AndroidRuntime(708): at android.app.ActivityThread.main(ActivityThread.java:4627)
答案 0 :(得分:3)
你显然是从register方法返回null。在调用result.booleanValue()
之前,返回非空的内容或进行空检查。
你可以这样做:
if (result == null) {
}
else if (result.booleanValue()) {
}
else {
}
顺便说一下,为什么需要返回一个布尔而不是布尔值(基本类型,不能为null)。
答案 1 :(得分:0)
尝试使用toast的参数作为activity.class的名称。我认为在你的情况下是Register.class而不是Register.this
答案 2 :(得分:0)
尝试将上下文传递给变量。或者尝试Register.this.getApplicationContext()
或BaseContext
。检查对话框是否为空,如果与您的要求不重叠,请在postExecute()
中传递值并创建新对话框:)
答案 3 :(得分:0)
我写过这个
protected void onPostExecute(String unused) {
dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
Toast.makeText(
myclassname.this,
"Downloading of " + FILENAME
+ " complete.", Toast.LENGTH_LONG).show();
refreshList();
}
这对我有用..
see this link for more detail
http://hi.baidu.com/hi_android/blog/item/fea149f90da7fdedfd037f56.html
http://www.screaming-penguin.com/node/7746
答案 4 :(得分:0)
通过启动像这样的Toasts,我摆脱了同样的Toast / Async / Nullpointe问题:
Toast.makeText(getApplicationContext(), "Hello Toast!", Toast.LENGTH_SHORT).show();