【问题标题】:Show 'please wait' during web service call在 Web 服务调用期间显示“请稍候”
【发布时间】:2011-08-18 15:12:07
【问题描述】:

我有一个通过 .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”函数:

公共布尔用户名IsAvailable() {

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

谢谢 迈克

【问题讨论】:

  • 谢谢,我明白我不应该阻止 UI 线程,我只需要!这是我的代码的一部分: private OnClickListener RegistrationListener = new OnClickListener() { public void onClick(View v) { ClearFieldHighlighting(); if (ValidateData()) { if (IsOnline()) { if (UsernameIsAvailable()) { try { iNETUserID = CreateOnlineUser(); } catch (Exception e) { } 是对 UsernameIsAvailable 的调用导致了问题,因为它返回了一个我需要继续的 bool 结果!

标签: android multithreading web-services android-asynctask


【解决方案1】:

您可以按以下方式构建您的代码:

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
}

【讨论】:

    【解决方案2】:

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

    使用DialogsetCancelable(false) 确保用户无法关闭对话框

    【讨论】:

    • 我 +1 了,但我不认为使用 setCancelable(false) 对可用性有好处。如果用户不耐烦,应用程序应该能够取消请求。更好的方法是显示某种进度指示器,以便反馈某事正在发生。
    • 我已经用 asynctask 尝试过 - 我的主代码在 Web 服务调用运行时继续执行 - 我不希望这种情况发生!
    • 您对应用程序进行编码,以便您的“主代码”等待AsyncTask 完成。正如 Kevin 所说,你不应该阻塞 UI 线程,因为它会使你的应用程序对用户没有响应。如果您发布一些代码,我们可以提供更具体的帮助。
    • 您是否在等待任务完成后再继续?这通常通过启动AsyncTask 来完成,然后让任务调用onPostExecute 中的一个函数来执行其余的主要处理。换句话说,无论哪个函数启动 AsyncTask 都应该启动它,停止进一步处理,然后在另一个从 onPostExecute 调用的函数中继续处理。
    • 如果你喜欢这个答案,你应该接受/投票,以便将来寻求类似帮助的人可以找到它:)
    猜你喜欢
    • 2012-02-05
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多