2011-06-28 76 views
2

我正在处理我的web服务,并且出现了一个奇怪的问题,我无法解决这个问题,因为我是android开发新手。当我在异步任务的方法中显示祝词时,我收到空指针异常。有人请帮我解决这个问题异步任务的空指针异常

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(); 
} 


} 
} 

这些r是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

http://www.xoriant.com/blog/mobile-application-development/android-async-task.html – Android

+0

如何调用之前进行空校验result.booleanValue()? – Raj

+0

我试着用下面的建议,但它只显示进度对话框作为输出,没有别的 – Raj

回答

3

你显然从寄存器方法返回null。在调用result.booleanValue()之前,返回非空值或进行空值检查。

你可以是这样做的:

if (result == null) { 

} 
else if (result.booleanValue()) { 

} 
else { 

} 

顺便说一句,你为什么要返回一个布尔值,而不是布尔(原始类型,不能为null)。

+0

感谢您的回复,但你可以帮助代码片段,我很困惑 – Raj

+0

如何进行空检查之前调用result.booleanValue()? – Raj

+0

请参阅我编辑的答案。 – kgiannakakis

0

尝试使用为您的吐司的activity.class名的说法。我认为你的情况是Register.class而不是Register.this

+0

如果我使用register.class我得到的错误像类型Toast中的方法makeText(Context,CharSequence,int)不适用于参数(Class ,String,int) – Raj

+0

这个答案不正确。请参阅:http://developer.android.com/reference/android/widget/Toast.html#makeText(android.content.Context,java.lang.CharSequence,int) – Marmoy

+0

是否注册您的活动?我使用了很多次代码... – Dayerman

0

尝试将上下文传递给变量。或者尝试Register.this.getApplicationContext()BaseContext。检查对话框为空,使在postExecute()的值传递,并创建新的对话框,如果不从你的要求:)

+0

谢谢,但如何检查空值为了不返回null,有点困惑 – Raj

+0

@Raj检查像这样if(dialog!= null){做剩下的操作};所以如果对话框为空,那么什么都不会发生。如果该对话框不为空,则操作会定期进行。 –

+0

谢谢,我根据logcat响应得到了prblm和我的面包。在每一种情况下,我都会得到“再试一次”,如果(resultsRequestSOAP == null){ToS.makeText(Register.this.getApplicationContext(),“再试一次“,Toast.LENGTH_SHORT).show(); \t \t} \t \t否则,如果(resultsRequestSOAP.booleanValue()){ \t \t //也显示注册成功的对话框 \t \t \t Toast.makeText(Register.this.getApplicationContext(), “Registerd”,吐司。 LENGTH_SHORT).show(); \t \t} \t \t否则{ \t \t \t Toast.makeText(Register.this.getBaseContext(), “字段为空”,Toast.LENGTH_SHORT).show(); \t \t} – Raj

0

我写这

protected void onPostExecute(String unused) { 
      dismissDialog(DIALOG_DOWNLOAD_PROGRESS); 

      Toast.makeText(
        myclassname.this, 
        "Downloading of " + FILENAME 
          + " complete.", Toast.LENGTH_LONG).show(); 
      refreshList(); 


     } 

重叠,这是workning为我..

see this link for more detail
http://hi.baidu.com/hi_android/blog/item/fea149f90da7fdedfd037f56.html
http://www.screaming-penguin.com/node/7746

+0

@Pragana,谢谢,我根据logcat的response.In余米越来越 “重试” 如果(resultsRequestSOAP == NULL)每一个案件{ \t \t \t Toast.makeText得到了与我举杯prblm(寄存器。 this.getApplicationContext(),“再试一次”,Toast.LENGTH_SHORT).show(); \t \t} \t \t否则,如果(resultsRequestSOAP.booleanValue()){ \t \t //也显示注册成功的对话框 \t \t \t Toast.makeText(Register.this.getApplicationContext(), “Registerd”,吐司。 LENGTH_SHORT).show(); \t \t} \t \t否则{ \t \t \t Toast.makeText(Register.this.getBaseContext(), “字段为空”,Toast.LENGTH_SHORT).show(); \t \t} – Raj

0

我被推出的TOA摆脱相同的吐司/异步/ Nullpointe问题TS是这样的:

Toast.makeText(getApplicationContext(), "Hello Toast!", Toast.LENGTH_SHORT).show();