我的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”,因为它在我的布局中不存在。
看起来这应该很容易 - 我在方法中遗漏了什么?
答案 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();
此外,代码中还有另一个问题,在解雇对话框之前,您似乎无法检查是否已完成任务。