异步任务的空指针异常
Posted
技术标签:
【中文标题】异步任务的空指针异常【英文标题】:Null pointer exception for async task 【发布时间】:2011-09-24 05:54:42 【问题描述】:我正在处理我的网络服务,我遇到了一个奇怪的问题,我无法解决这个问题,因为我是 android 开发的新手。在异步任务的onPostExecute()
方法中显示吐司时出现空指针异常。请有人帮我解决这个问题
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)
【问题讨论】:
xoriant.com/blog/mobile-application-development/… 如何在调用result.booleanValue()之前做空检查? 我尝试了以下建议,但它只显示进度对话框作为输出,没有别的 【参考方案1】:尝试使用您的activity.class 的名称作为Toast 的参数。我认为在你的情况下是 Register.class 而不是 Register.this
【讨论】:
如果我使用 register.class,我会遇到类似 Toast 类型中的方法 makeText(Context, CharSequence, int) 不适用于参数 (Class您显然是从 register 方法返回 null 。在调用 result.booleanValue()
之前返回非空值或进行空值检查。
你可以这样做:
if (result == null)
else if (result.booleanValue())
else
对了,为什么需要返回一个布尔值而不是布尔值(原始类型,不能为空)。
【讨论】:
感谢您的回复,但您能帮我解决一下代码 sn-p,我有点困惑 如何在调用result.booleanValue()之前做空检查? 再次感谢,我想检查 logcat 的结果,如果它是 1,那么我应该显示像“REGISTERD”这样的祝酒词或警报,否则为“TRYAGAIN” 我试过了,但只有进度对话框显示,什么也没有,几分钟后强制关闭【参考方案3】:尝试将上下文传递给变量。或尝试Register.this.getApplicationContext()
或BaseContext
。检查对话框是否为空,传递值并在postExecute()
中创建新对话框,如果这与您的要求不重叠:)
【讨论】:
谢谢,但是如何检查空值以免返回空值,有点困惑 @Raj Check like this if(dialog != null) do the rest of operation ;所以如果对话框为空,那么什么都不会发生。如果对话框不为空,则操作会定期进行。 谢谢,根据 logcat 响应,我得到了带有 toast 的 prblm。在每种情况下,如果 (resultsRequestSOAP == null) Toast.makeText(Register.this.getApplicationContext( ), "再试一次", Toast.LENGTH_SHORT).show(); else if (resultsRequestSOAP.booleanValue()) //也显示注册成功对话框 Toast.makeText(Register.this.getApplicationContext(), "Registerd", Toast.LENGTH_SHORT).show(); else Toast.makeText(Register.this.getBaseContext(), "字段为空", Toast.LENGTH_SHORT).show(); 【参考方案4】:我写了这个
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 detailhttp://hi.baidu.com/hi_android/blog/item/fea149f90da7fdedfd037f56.htmlhttp://www.screaming-penguin.com/node/7746
【讨论】:
@Pragana,谢谢,根据 logcat 响应,我得到了带有 toast 的 prblm。在每种情况下,如果 (resultsRequestSOAP == null) Toast.makeText(Register.this .getApplicationContext(), "再试一次", Toast.LENGTH_SHORT).show(); else if (resultsRequestSOAP.booleanValue()) //也显示注册成功对话框 Toast.makeText(Register.this.getApplicationContext(), "Registerd", Toast.LENGTH_SHORT).show(); else Toast.makeText(Register.this.getBaseContext(), "字段为空", Toast.LENGTH_SHORT).show(); 【参考方案5】:通过像这样启动 Toast,我摆脱了同样的 Toast/Async/Nullpointe 问题:
Toast.makeText(getApplicationContext(), "Hello Toast!", Toast.LENGTH_SHORT).show();
【讨论】:
以上是关于异步任务的空指针异常的主要内容,如果未能解决你的问题,请参考以下文章
记录一些遇见的bug——记录一个使用多线程异步调用openfeign时子线程丢失request请求头导致的空指针异常错误