Android 在web服务调用期间显示“请稍候”

Android 在web服务调用期间显示“请稍候”,android,multithreading,web-services,android-asynctask,Android,Multithreading,Web Services,Android Asynctask,我有一个通过.net web服务检查用户名可用性的活动,我需要在调用过程中显示一条“请稍候”消息,因为这可能需要一两秒钟的时间-我已经尝试过AsyncTask和线程,但我遇到的问题是,在web服务调用完成之前,我实际上想阻止主线程和唯一线程,因为我依赖于它的结果来处理其他逻辑 我尝试过各种各样的方法,但都没有乐趣——有人能帮我吗 根据要求,以下是我的代码部分: private OnClickListener RegistrationListener = new OnClickListener()

我有一个通过.net web服务检查用户名可用性的活动,我需要在调用过程中显示一条“请稍候”消息,因为这可能需要一两秒钟的时间-我已经尝试过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”函数:

公共布尔用户名可用{

    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服务内容

谢谢
Mike

您永远不应该阻止主ui线程。只需显示一个对话框,其中包含有关正在发生的事情的消息。确保用户无法关闭该对话框。AsyncTask或runnable完成任务后,立即关闭该对话框


使用false可确保用户无法关闭对话框。您永远不应阻止主ui线程。只需显示一个对话框,其中包含有关正在发生的事情的消息。确保用户无法关闭对话框。AsyncTask或runnable任务完成后,立即关闭该对话框


使用false可确保用户无法关闭对话框

您可以按以下方式构造代码:

私有类MyBackgroundTask扩展了AsyncTask{ 受保护的void onPreExecute{ //显示对话框 } 受保护的Void doInBackgroundVoid…未使用{ //背景处理 } 未使用的PostExecuteVoid上的受保护无效{ //取消对话框 连续处理; } } private OnClickListener RegistrationListener=新建OnClickListener{ 公共视图v{ //非阻塞码 新建MyBackgroundTask.execute; } } 公共空间继续处理{ //其余的主要活动 }
您可以按以下方式构造代码:

私有类MyBackgroundTask扩展了AsyncTask{ 受保护的void onPreExecute{ //显示对话框 } 受保护的Void doInBackgroundVoid…未使用{ //背景处理 } 未使用的PostExecuteVoid上的受保护无效{ //取消对话框 连续处理; } } private OnClickListener RegistrationListener=新建OnClickListener{ 公共视图v{ //非阻塞码 新建MyBackgroundTask.execute; } } 公共空间继续处理{ //其余的主要活动 }
我+1愿意,但我不认为使用setCancelablefalse对可用性有好处。如果用户不耐烦,应用程序应该能够取消请求。更好的方法是显示某种进度指示器,以便有反馈表明发生了什么。我已经用asynctask尝试过这一点-我的主代码继续执行ilst web服务调用正在运行-我不希望发生这种情况!您对应用程序进行编码,以便主代码等待异步任务完成。正如Kevin所说,您不应该阻止UI线程,因为它会使应用程序对用户无响应。如果您发布一些代码,我们可以提供更具体的帮助。您在等待吗如果要在继续之前完成任务,通常需要启动AsyncTask,然后让任务在onPostExecute中调用一个函数来执行其余的主处理。换句话说,启动AsyncTask的任何函数都应该启动它,停止进一步的处理,并在另一个正在运行的函数中进行处理从onPostExecute调用。如果您喜欢答案,您应该接受/向上投票,以便将来寻求类似帮助的人可以找到它:I+1'd,但我不认为使用setCancelablefalse有利于可用性。如果用户不耐烦,应用程序应该能够取消请求。更好的方法是显示某种f progress indicator,因此有反馈说发生了什么事情。我已经用asynctask尝试过了-我的主代码在web服务调用运行时继续执行-我不希望发生这种情况!您编写应用程序代码,以便主代码等待asynctask完成。正如Kevin所说,您不应该阻止UI线程因为这会使您的应用程序对用户无响应。如果您发布一些代码,我们可以提供更具体的帮助。您是否在继续之前等待任务完成?这通常是通过启动AsyncTask,然后让任务在onPostExecute中调用一个函数来完成的,该函数将执行您的其余主要处理。在其他情况下换句话说,启动AsyncTask的任何函数都应该启动它,停止进一步的处理,并在从onPostExecute调用的另一个函数中拾取处理。如果您喜欢答案,您应该接受/向上投票,以便将来的人们寻求类似的帮助
可以找到它:谢谢,我明白我不应该阻止UI线程,我只需要!下面是我的代码的一部分:private OnClickListener RegistrationListener=new OnClickListener{public void onClickView v{clearfieldholling;if ValidateData{if IsOnline{if usernameisavable{try{iNETUserID=CreateOnlineUser;}捕获异常e{}这是对UsernameIsAvailable的调用导致了问题,因为它返回了一个bool结果,我需要继续!谢谢,我明白我不应该阻止UI线程,我只需要!下面是我代码的一部分:private OnClickListener RegistrationListener=new OnClickListener{public void onClickView v{ClearFieldHighlighting;if ValidateData{if IsOnline{if UsernameIsAvailable{try{iNETUserID=CreateOnlineUser;}捕获异常e{}是对usernameisailable的调用导致了问题,因为它返回了bool结果,我需要继续!