我有一个带有Tabhost的Activity,所有选项卡都由Activities表示,其中一个名为BrowserTab。
所有这些活动都会观察一个Observable类Data。
在BrowserTab中,我调用Data中的一个方法,该方法从Internet检索一些数据。 我想在调用此方法时通过ProgressDialog通知用户。 我试过这样的话:
在BrowserTab中:
public void loadXML(){
progressDialog = ProgressDialog.show(this, "", "Loading. Please wait...", true);
data.loadXML(getUrl());
}
public void update(Observable o, Object arg)
{
progressDialog.dismiss();
}
在数据中:
public void loadXML(String url)
{
this.xml = new XMLParser().parse(url);
setChanged();
notifyObservers();
}
像这样,加载后会出现ProgressDialog,立即再次消失。
当我在Data中的loadXML(String url)方法中创建一个新线程时,当收到Observers通知时,我得到一个“Activity has leaked window”异常。
我已经搜索了这个问题的解决方案,但我无法弄清楚如何解决这个问题。 有人有想法吗?
答案 0 :(得分:0)
尝试使用此更改代码..
progressDialog = ProgressDialog.show(getParent(), "", "Loading. Please wait...", true);
答案 1 :(得分:0)
旧答案::请检查上次修改
答案是使用 this.getApplicationContext()而不是这个:
progressDialog = ProgressDialog.show(this.getApplicationContext(), "", "Loading. Please wait...", true);
更多解释如下:
ProgressDialog : how to prevent Leaked Window
修改强>
我后来发现了 this.getApplicationContext()
总是等于null,所以我使用 DialogFragment 并添加 ProgressBar 而不是使用普通的 ProgressDialog 。
编辑2 这个answer更好,因为它解决了根本原因。在对话框之前,托管对话框的窗口被取消,因此只需要求活动在被解除之前关闭对话框
答案 2 :(得分:0)
我总是使用基于C ++的样式方法来解决这个问题。因此,您应该使用进度对话框的WeakReference(在C ++中有TWeakObjectPtr)。在分离的线程,asyncTask等中使用WeakReference确保如果某个actor作为GC清除引用,WeakReference.get()将返回null。因此,您可以推断您即将使用泄露的窗口......
这是它的工作原理。我们可以说明一个基于asyncTask的构造函数,如下所示......
public class ProductTechnicalResponse {
@SerializedName("status")
@Expose
private Integer status;
@SerializedName("message")
@Expose
private String message;
@SerializedName("model")
@Expose
private Map<String, Map<String, Object>> model;
}
希望有所帮助