Android - 从事件处理程序

时间:2017-06-10 00:58:36

标签: android

我的Android应用中有一个Web服务请求,可能需要一两秒才能运行。我有一个事件处理程序,它在完成时触发。我正在尝试显示一个对话框,以显示此请求的进度。

到目前为止,我有这个:

var progressDialog = Android.App.ProgressDialog.Show(this.Activity, "Please wait...", "Communicating with server...", true);
new Thread(new ThreadStart(delegate {
                   WCFClient WCF = WCFService();
                   WCF.TestCompleted+= TestCompleted;
                   WCF.TestAsync(GetID());

                   progressDialog.Dismiss();}
                 )
           ).Start();

问题很明显,对话框显示并在闪光灯中消失。我在UI线程中声明var progressDialog。如何在事件处理程序中再次引用它?

我通常会使用RunOnUIThread,但我无法以这种方式定位“progressDialog”,因为它在我的布局中不存在。

看起来这应该很容易 - 我在方法中遗漏了什么?

2 个答案:

答案 0 :(得分:0)

您的代码存在一些问题。首先是内存泄漏。您将保留线程中的进度对话框。如果用户旋转设备,您的Activity将被终止,但垃圾收集器将无法垃圾收集引用,因为您的线程正在抓住它。

其次,你不能从另一个线程更新UI,你必须在UI线程上更新。

答案 1 :(得分:0)

您需要使用Handler,将引用传递给其他线程(在构造函数中),然后在需要时向UIthread发送消息以关闭进度对话框。

Handler mHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                  if (progressDialog.isShowing()) progressDialog.dismiss();
            }
    };
在线程中

执行此操作:

mHandler.obtainMessage().sendToTarget();

此外,代码中还有另一个问题,在解雇对话框之前,您似乎无法检查是否已完成任务。