【问题标题】: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)

【问题讨论】:

标签: android nullpointerexception android-asynctask


【解决方案1】:

尝试使用您的activity.class 的名称作为Toa​​st 的参数。我认为在你的情况下是 Register.class 而不是 Register.this

【讨论】:

  • 如果我使用 register.class,我会遇到类似 Toast 类型中的方法 makeText(Context, CharSequence, int) 不适用于参数 (Class, String, int)
  • 这个答案不正确。见:developer.android.com/reference/android/widget/…, java.lang.CharSequence, int)
【解决方案2】:

您显然是从 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 detail
http://hi.baidu.com/hi_android/blog/item/fea149f90da7fdedfd037f56.html
http://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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 2015-06-16
    • 1970-01-01
    相关资源
    最近更新 更多