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的主要内容,如果未能解决你的问题,请参考以下文章
在循环中使用 setBackgroundColor 和 setImageDrawable 时 Android 强制关闭 [关闭]