Android ProgressDialog:泄露的窗口

时间:2011-04-16 19:25:51

标签: android progressdialog

我有一个带有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”异常。

我已经搜索了这个问题的解决方案,但我无法弄清楚如何解决这个问题。 有人有想法吗?

3 个答案:

答案 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;
}

希望有所帮助