我有一项通过.net网络服务检查用户名可用性的活动,我需要在通话期间显示“请稍候”消息,因为它可能需要一两秒钟 - 我已经尝试过AsyncTask和线程但问题我我实际上想要阻止主要(和唯一)线程,直到Web服务调用完成,因为我依赖于它的结果来处理其他逻辑。
我尝试了各种各样但没有快乐 - 有人可以帮忙吗?
根据要求,这是我的代码的一部分:
private OnClickListener RegistrationListener = new OnClickListener() {
public void onClick(View v) {
ClearFieldHighlighting();
if (ValidateData()) {
if (IsOnline()) {
if (UsernameIsAvailable()) {
try {
iNETUserID = CreateOnlineUser();
} catch (Exception e) {
}
..更多代码.. }
这是'UsernameIsAvailable'功能:
public boolean UsernameIsAvailable(){
Boolean bUsernameIsAvailable = false;
SoapObject request = new SoapObject(TA.sNAMESPACE,
TA.METHOD_IsUsernameAvailable);
request.addProperty("sUsername", sEmail);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(
TA.WEBSERVICES_URL);
try {
androidHttpTransport.call(TA.SOAP_ACTION_IsUsernameAvailable,
envelope);
SoapObject thisresponse = (SoapObject) envelope.bodyIn;
for (int i = 0; i < thisresponse.getPropertyCount(); i++) {
Object obj = thisresponse.getProperty(i);
SoapPrimitive soapPrimitive = (SoapPrimitive) obj;
bUsernameIsAvailable = Boolean.parseBoolean(soapPrimitive
.toString());
}
} catch (Exception e) {
}
return bUsernameIsAvailable;
}
我正在使用KSoap2这是一个外部jar文件来处理Web服务的东西
由于 麦克
答案 0 :(得分:2)
你永远不应该阻止主ui线程。只需显示一个对话框,其中包含有关正在进行的操作的消息确保用户无法关闭对话框。只要AsyncTask或runnable完成其任务,就关闭对话框。
使用Dialog setCancelable(false)确保用户无法关闭对话框
答案 1 :(得分:2)
您可以通过以下方式构建代码:
private class MyBackgroundTask extends AsyncTask<Void, Void, Void> {
protected void onPreExecute() {
// show dialog
}
protected Void doInBackground(Void... unused) {
// background processing
}
protected void onPostExecute(Void unused) {
// dismiss dialog
continueProcessing();
}
}
private OnClickListener RegistrationListener = new OnClickListener() {
public void onClick(View v) {
// non-blocking code
new MyBackgroundTask().execute();
}
}
public void continueProcessing() {
// the rest of the main activity
}