异步任务的空指针异常

时间:2011-06-28 11:31:55

标签: android nullpointerexception android-asynctask

我正在处理我的网络服务,我遇到了一个奇怪的问题,因为我是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)

5 个答案:

答案 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();
相关问题