0

我已经检查了这个链接并实现了以下但我仍然收到错误 ProgressDialog :如何防止泄漏窗口

这是我的代码

public class MyClass extends AsyncTask<Void , Void , Void>
{       

    private ProgressDialog progress;
    public MyClass(ProgressDialog progress)
    {
        this.progress = progress;
    }
    public void onPreExecute()
    {

        progress.show();
    }
    protected Void doInBackground(Void... params) {
        try {               
            /**
             * Create a new instance of the SAX parser
             **/
            SAXParserFactory saxPF = SAXParserFactory.newInstance();
            SAXParser saxP = saxPF.newSAXParser();
            XMLReader xmlR = saxP.getXMLReader();
            URL url = new URL("http://zaggle.foostor.in/xml/get_product_by_id/"+((MyApplication) getApplicationContext()).categoryid); // URL of the XML        
            /** 
             * Create the Handler to handle each of the XML tags. 
             **/
            XMLHandlerforDetailsofproduct myXMLHandler = new XMLHandlerforDetailsofproduct();
            xmlR.setContentHandler(myXMLHandler);
            xmlR.parse(new InputSource(url.openStream()));              
        } catch (Exception e) {
            System.out.println(e);
        }
        data = XMLHandlerforDetailsofproduct.data;
        for (int i = 0; i < data.getdenominationsvalue().size(); i++) {

            denomvalue.add(data.getdenominationsvalue().get(i));
            denomid.add(data.getdenominationsid().get(i));
            disc.add(data.getdiscount().get(i));
            stock.add(data.getstock().get(i));

        }           



        return null;            
    }

    public void onPostExecute(Void unused)
    {

        this.progress.dismiss();
        this.progress = null;

    }       

}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.store_denomination);
    spin1 = (Spinner)findViewById(R.id.spin);   
    ProgressDialog progress = new ProgressDialog(this);
    progress.setMessage("Loading......");
    new MyClass(progress).execute();
            ---------------------------------

and the code continues
}

这是我的日志:

08-10 10:36:19.500: E/WindowManager(835): Activity com.androidhive.xmlparsing.Detailsofproduct has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44f15250 that was originally added here
08-10 10:36:19.500: E/WindowManager(835): android.view.WindowLeaked: Activity com.androidhive.xmlparsing.Detailsofproduct has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44f15250 that was originally added here
08-10 10:36:19.500: E/WindowManager(835):   at android.view.ViewRoot.<init>(ViewRoot.java:247)
08-10 10:36:19.500: E/WindowManager(835):   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
08-10 10:36:19.500: E/WindowManager(835):   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
08-10 10:36:19.500: E/WindowManager(835):   at android.view.Window$LocalWindowManager.addView(Window.java:424)
08-10 10:36:19.500: E/WindowManager(835):   at android.app.Dialog.show(Dialog.java:241)
08-10 10:36:19.500: E/WindowManager(835):   at com.androidhive.xmlparsing.Detailsofproduct$MyClass.onPreExecute(Detailsofproduct.java:75)
08-10 10:36:19.500: E/WindowManager(835):   at android.os.AsyncTask.execute(AsyncTask.java:391)
08-10 10:36:19.500: E/WindowManager(835):   at com.androidhive.xmlparsing.Detailsofproduct.onCreate(Detailsofproduct.java:127)
08-10 10:36:19.500: E/WindowManager(835):   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-10 10:36:19.500: E/WindowManager(835):   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
08-10 10:36:19.500: E/WindowManager(835):   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
08-10 10:36:19.500: E/WindowManager(835):   at android.app.ActivityThread.access$2300(ActivityThread.java:125)
08-10 10:36:19.500: E/WindowManager(835):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
08-10 10:36:19.500: E/WindowManager(835):   at android.os.Handler.dispatchMessage(Handler.java:99)
08-10 10:36:19.500: E/WindowManager(835):   at android.os.Looper.loop(Looper.java:123)
08-10 10:36:19.500: E/WindowManager(835):   at android.app.ActivityThread.main(ActivityThread.java:4627)
08-10 10:36:19.500: E/WindowManager(835):   at java.lang.reflect.Method.invokeNative(Native Method)
08-10 10:36:19.500: E/WindowManager(835):   at java.lang.reflect.Method.invoke(Method.java:521)
08-10 10:36:19.500: E/WindowManager(835):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-10 10:36:19.500: E/WindowManager(835):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-10 10:36:19.500: E/WindowManager(835):   at dalvik.system.NativeStart.main(Native Method)

谁能建议在哪里做错了什么?

4

2 回答 2

1

我认为这可能是您的解决方案

首先像这样删除在 preExcecute 方法中创建的构造函数和进度对话框实例

protected void onPreExecute() {
                dialog=new ProgressDialog(Activity.this);
                dialog.show();
                super.onPreExecute();
            }
于 2012-08-10T05:21:46.980 回答
0

啊……

以我的经验,ProgressDialog 是在 Myclass 中创建的。

如果您在 onreate 中创建 ProgressDialog 并且 Myclass(extends AnsyncTask) 从自己的构造函数中获取 ProgressDialog,则可能会引发错误。

public class MyClass extends AsyncTask {
private ProgressDialog progress = new ProgressDialog(getparent());

/* public MyClass(ProgressDialog progress)
{
    this.progress = progress;
} */

public void onPreExecute()
{

    progress.show();
}
protected Void doInBackground(Void... params) {
    try {               
        /**
         * Create a new instance of the SAX parser
         **/

……

像这样使用。

我的代码已成功执行。

于 2012-08-10T05:31:29.443 回答