当 Activity 从 Web 服务请求 SoapObject 时,如何实现 ProgressDialog?

2023-12-09

我知道带有线程的 ProgressDialog 问题已被问过很多次,但似乎没有一个解决方案适合我的项目。基本上我想做的是这样的: 1)当用户单击按钮时,活动向服务器发送身份验证请求 2) 执行此操作时会显示 ProgressDialog 3)当响应到来时,我想关闭 ProgressDialog 和由 Activity 读取和解释的返回对象

如果我: 1)设置线程用响应更新Application字段,下一个方法(在线程之外)在访问该字段时抛出NPE 2)如果我在线程中包含下一个方法,第二个方法会抛出“java.lang.RuntimeException:无法在未调用 Looper.prepare() 的线程内创建处理程序”

抱歉,文字很长,但我完全失去了它......我的代码是这样的:

public class XXX extends Activity implements OnClickListener {

// (...)
private SoapObject returnObject;
private String response;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // (...)
        authProgressDialog = ProgressDialog.show(XXX.this, "", "Authenticating...", true, false);
        new Thread(new Runnable() {
            @Override
            public void run() {
                authenticate(); // method that calls the API via SOAP
                authenticateReal(); // method that handles the response
            }
        }).start();

        mHandler = new Handler() {
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                switch (msg.what) {
                    case 10:
                        authProgressDialog.dismiss();
                        break;
                }
            }
        };
    }
}

public void authenticate() {
    // API stuff (...)
    AndroidHttpTransport aht = new AndroidHttpTransport(URL);
    try {
        aht.call(SOAP_ACTION, soapEnvelope);
        returnObject = (SoapObject) soapEnvelope.getResponse();
        response = returnObject.getProperty("ResponseStatus").toString();
    }
    catch (Exception e) {
        e.printStackTrace();
    }
    finally {
        mHandler.sendEmptyMessage(10);
    }
}

// Method that needs to access returnObject and reponse objects and
// it is here where the NPE's or other exceptions are thrown
public void authenticateReal() {
// (...)
}

你最好用AsyncTask(这是Android方式):

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    new TheTask().execute();
}

private class TheTask extends AsyncTask<Void, Void, Void>{

    @Override
    protected void onPreExecute() {
        authProgressDialog = ProgressDialog.show(XXX.this, "", "Authenticating...", true, false);
    }

    @Override
    protected Void doInBackground(Void... params) {
        authenticate(); // method that calls the API via SOAP
        authenticateReal(); // method that handles the response
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        authProgressDialog.dismiss();
    }
}

顺便说一下......我发现这个演示文稿非常有用(它讨论了 REST 应用程序,但您可以将相同的概念应用于不同类型的应用程序):开发 Android REST 客户端应用程序

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当 Activity 从 Web 服务请求 SoapObject 时,如何实现 ProgressDialog? 的相关文章

随机推荐

  • 如何使用 REST API 下载 Parse.com 文件类型?

    Parse com REST API 文档列出了与 Parse com 数据交互的多种方式 例如上传和下载类 它还描述了上传文件 但它没有提到如何从 Parse com 下载文件 有谁知道这是否可能 如果可以 该怎么做 Parse com
  • WCF 耐用服务是正确的选择吗?

    我们正在选择在 WCF 会话 调用之间保存状态的最佳方法 我们发现WCF耐用服务适合我们的需要 我们想知道这对于大量使用是否可以 我们预计有 1000 多个会话 每个会话将保存大约 100KB 的数据 xml 序列化格式 并保存复杂的对象
  • 使用延迟形状数组从 C 调用 Fortran

    是否可以从 C C 调用 Fortran 子例程 其中 Fortran 参数之一是延迟形状数组 希望我正确使用了术语 延迟形状 在下面的例子中 subr1 使用显式形状 并且工作正常 但是subr2 使用延迟形状并导致段错误 这个问题表示需
  • 如何将 PHP 数组表示为逗号分隔的字符串? [复制]

    这个问题在这里已经有答案了 可能的重复 PHP MYSQL 在 WHERE 子句中使用数组 我有一个 ID 值为 1 5 2 6 7 的数组 我需要在 MySQL item id IN 1 5 2 6 7 语句中使用它来仅选择具有数组中列出
  • “this”是否指的是调用此函数的元素?

    在下面的代码片段中我使用 this 引用调用该函数的元素 我知道这是不正确的 因为我打印了这些值 它给了我 未定义 如何引用输入元素 function datepicker datepicker onSelect function date
  • 如何像“netstat -p”一样但更快?

    netstat p 和 lsof n i P 似乎都读取链接所有进程 fd 例如stat proc fd 怎样做才能更有效率呢 我的程序想知道哪个进程正在连接到它 一次又一次地遍历所有流程似乎效率太低 建议 iptables 或内核补丁的方
  • 引导网格与折叠容器之间

    这是我的第一个问题 我希望你能帮助我 我正在尝试使用引导网格设置产品概述页面 我已经连续购买了 4 款大屏幕产品 对于较小的屏幕尺寸 我希望每行有 2 个产品 诀窍是 我想将产品详细信息放在行之间的折叠容器中 当我单击产品时 该容器会打开
  • 多处理打印语句在 Spyder IDE 中不起作用

    在运行 Windows Server 2012 R2 的计算机上 在 Anaconda 的 Spyder IDE 中并使用以下代码运行 Python 3 7 import time import multiprocessing start
  • 使用 pyqtgraph 绘图而不显示

    我正在尝试从 matplotlib 转向使用 pyqtgraph 进行绘图 因为它具有更快地渲染和保存图像的能力 当我尝试在具有多处理器的集群上执行此操作时 我遇到了以下问题 QStandardPaths XDG RUNTIME DIR未设
  • 在 Android 上设置 MonkeyRunner

    我想使用 MonkeyRunner 我有一个 Monkeyrunner jar 并将其导入到我的项目中 我现在该如何使用它 你能告诉我我应该一步一步做什么吗 我在 python 上看到了一些代码片段 但我不明白如何在 eclipse 中使用
  • 无法使用spark从s3存储桶读取

    val spark SparkSession builder appName try1 master local getOrCreate val df spark read json s3n BUCKET NAME FOLDER FILE
  • iOS 7 更改 UINavigationBar titleView alpha

    所以我使用iOS7的UINavigationBar组件 而不是UINavigationController本身 当我使用自定义导航控制器推送新视图时 我想将标题的 alpha 更改为 0 0 然后再更改回来 但我似乎无法让它工作 我正在尝试
  • Android 以编程方式向应用程序添加小部件警告消息

    我创建了一个测试 Android 启动器应用程序 并将其作为系统应用程序安装在已 root 的设备上 该应用程序的目标是将所有已安装的小部件放置在视图页面的片段上 这已经成功完成 但是 每次显示新页面时都会向用户显示一条消息 即使用户选中该
  • 日历班级时间月份不匹配

    Calendar c Calendar getInstance System out println Mili gt gt c getTimeInMillis System out println Month gt gt Calendar
  • 是否可以重置 ServicePointManager?

    我正在尝试遵循类似于给出的代码System Net Mail SMTPClient如何进行本地IP绑定我在具有多个 IP 地址的计算机上使用 Windows 7 和 Net 4 0 我有绑定IPEndPointDelegate定义的 pri
  • Android Realm - 从服务访问 Realm 对象

    我有一个在我的活动中创建的领域对象 我需要能够在我创建的服务中访问该对象 但是 我在服务中创建 Realm 对象时收到错误 mRealm Realm getInstance getApplicationContext java lang I
  • 从 zip 文件中提取文件并保留 mod 日期?

    我正在尝试使用 Python 2 7 1 在 Windows 上 仅供参考 从 zip 文件中提取文件 并且我的每次尝试都显示提取的文件的修改日期 提取时间 这是不正确的 import os zipfile outDirectory C T
  • 从 APK 安装应用程序时出现 java.lang.ClassNotFoundException [重复]

    这个问题在这里已经有答案了 我在下面描述的错误发生在以下情况 直接通过 APK 在设备上安装应用程序 通过 Play 商店下载应用程序 在以下情况下不会发生该错误 通过 Eclipse 安装 apk 按下 运行 按钮 java lang R
  • 使用反射来指定委托的类型(附加到事件)?

    我实际上想做的是这样的 我意识到这不是有效的代码 Attach the event try EventInfo e mappings name e EventHandlerType handler sender raw gt AutoWra
  • 当 Activity 从 Web 服务请求 SoapObject 时,如何实现 ProgressDialog?

    我知道带有线程的 ProgressDialog 问题已被问过很多次 但似乎没有一个解决方案适合我的项目 基本上我想做的是这样的 1 当用户单击按钮时 活动向服务器发送身份验证请求 2 执行此操作时会显示 ProgressDialog 3 当