Android 强制关闭 ProgressDialog

Posted

技术标签:

【中文标题】Android 强制关闭 ProgressDialog【英文标题】:Android Force Close on ProgressDialog 【发布时间】:2011-06-13 17:26:37 【问题描述】:

我试图在抓取 RSS 提要时显示不确定的 ProgressDialog。我弹出对话框,但是一旦返回结果,我就会强制关闭。我怀疑适配器已填充并会更新 UI。代码如下。我的猜测正确吗?

        public void getRSS(String rss)
    

        new GetRSS().execute(rss);

    
    private class GetRSS extends AsyncTask<String, Void, Void>
    
        private ProgressDialog Dialog = new ProgressDialog(View2.this);

        protected void onPreExecute() 

            Dialog.setMessage("Please wait...");
            Dialog.show();
        

        protected void onPostExecute(Void nothing)
        
            Dialog.dismiss();
        

        protected Void doInBackground(String... rss) 
        URL feedUrl;
        try
            
                feedUrl = new URL(rss[0]);

                SyndFeedInput input = new SyndFeedInput();
                SyndFeed feed = input.build(new XmlReader(feedUrl));
                List entries = feed.getEntries();

                Iterator iterator = entries.listIterator();
                while (iterator.hasNext())
                    
                        SyndEntry ent = (SyndEntry) iterator.next();
                        String title = ent.getTitle();
                        //String uri = ent.getUri();
                        //d.add(uri);

                        SyndContent content = (SyndContent)ent.getContents().get(0);
                        d.add(content.getValue());
                        adapter.add(title);
                    
                adapter.notifyDataSetChanged();
            
        catch (MalformedURLException e)
            
                e.printStackTrace();
            
        catch (IllegalArgumentException e)
            
                e.printStackTrace();
            
        catch (FeedException e)
            
                e.printStackTrace();
            
        catch (IOException e)
            
                e.printStackTrace();
            
        return null;
        
    
    */

这里是堆栈转储 - 显然调用 notify 是问题所在。现在我只是无法确定在哪里调用通知:

01-22 12:02:28.701: ERROR/WindowManager(571): Activity com.digthisband.dtb.jg.View2 has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@43e6ae88 that was originally added here

01-22 12:02:28.701: ERROR/WindowManager(571): android.view.WindowLeaked: Activity com.digthisband.dtb.jg.View2 已泄露窗口 com.android.internal.policy.impl.PhoneWindow$最初在这里添加的 DecorView@43e6ae88 01-22 12:02:28.701: 错误/WindowManager(571): 在 android.view.ViewRoot.(ViewRoot.java:247) 01-22 12:02:28.701: 错误/WindowManager(571): 在 android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148) 01-22 12:02:28.701: 错误/WindowManager(571): 在 android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 01-22 12:02:28.701: 错误/WindowManager(571): 在 android.view.Window$LocalWindowManager.addView(Window.java:424) 01-22 12:02:28.701: 错误/WindowManager(571): 在 android.app.Dialog.show(Dialog.java:241) 01-22 12:02:28.701: 错误/WindowManager(571): 在 com.digthisband.dtb.jg.View2$GetRSS.onPreExecute(View2.java:97) 01-22 12:02:28.701: 错误/WindowManager(571): 在 android.os.AsyncTask.execute(AsyncTask.java:391) 01-22 12:02:28.701: 错误/WindowManager(571): 在 com.digthisband.dtb.jg.View2.getRSS(View2.java:87) 01-22 12:02:28.701: 错误/WindowManager(571): 在 com.digthisband.dtb.jg.View2.onCreate(View2.java:68) 01-22 12:02:28.701: 错误/WindowManager(571): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 01-22 12:02:28.701: 错误/WindowManager(571): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 01-22 12:02:28.701: 错误/WindowManager(571): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 01-22 12:02:28.701: 错误/WindowManager(571): 在 android.app.ActivityThread.access$2300(ActivityThread.java:125) 01-22 12:02:28.701: 错误/WindowManager(571): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 01-22 12:02:28.701: 错误/WindowManager(571): 在 android.os.Handler.dispatchMessage(Handler.java:99) 01-22 12:02:28.701: 错误/WindowManager(571): 在 android.os.Looper.loop(Looper.java:123) 01-22 12:02:28.701: 错误/WindowManager(571): 在 android.app.ActivityThread.main(ActivityThread.java:4627) 01-22 12:02:28.701: 错误/WindowManager(571): 在 java.lang.reflect.Method.invokeNative(Native Method) 01-22 12:02:28.701: 错误/WindowManager(571): 在 java.lang.reflect.Method.invoke(Method.java:521) 01-22 12:02:28.701: 错误/WindowManager(571): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 01-22 12:02:28.701: 错误/WindowManager(571): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 01-22 12:02:28.701: ERROR/WindowManager(571): at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

【参考方案1】:

最好能显示错误LogCat,它会说明导致异常的原因。 我还注意到您在 doInBackground 方法中调用了 notifyDataSetChanged() - 您应该只在 UI 线程中调用它。

【讨论】:

你是绝对正确的——我已经删除了对 notifyDataSetChanged 的​​调用并且崩溃消失了。我也没有得到我的数据。但这是一个开始...... 嘿...嗯,是的。标准的做法是调用 publishProgress() 。这反过来将在 UI 线程中自动调用 onProgressUpdate(),您可以在其中调用 notifyDataSetChanged()。您将需要覆盖 onProgressUpdate()。

以上是关于Android 强制关闭 ProgressDialog的主要内容,如果未能解决你的问题,请参考以下文章

在Android中强制关闭

在循环中使用 setBackgroundColor 和 setImageDrawable 时 Android 强制关闭 [关闭]

Android:如何在“强制关闭”后自动重启应用程序?

Android 强制关闭 ProgressDialog

如何确定Android应用程序是不是被强制关闭?

退出Android时应用程序强制关闭