【问题标题】:ProgressDialog crash in onPreExecute() methodonPreExecute() 方法中的 ProgressDialog 崩溃
【发布时间】:2015-10-21 16:00:16
【问题描述】:

ProgressDialog 在 onPreExecute() 方法中崩溃。

下面是我的代码sn-p:

        public class TestCasesActivity extends Activity {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_testcases);

                xmlHelp = new XmlHelper();

                ConfigParser confParser = new ConfigParser();
                confParser.execute();
            }

            private class ConfigParser extends AsyncTask<Void, Void, Void> {
                private ProgressDialog dialog;

            @Override
            protected void onPreExecute() {
                dialog = new ProgressDialog(TestCasesActivity.this);
                dialog.setMessage("Loading TestCases Configuration...");
                dialog.show();
            }

        @Override
        protected Void doInBackground(Void... params) {
            xmlHelp.getNumberOfNodes();
            return null;
        }

        @Override
        protected void onPostExecute(Void v) {
            dialog.dismiss();
            // Show test cases list here via a ListView
        }
}

请提出这里可能出现的问题。 logcat 打印如下:

07-30 08:13:50.511 20200-20200/? E/WindowManager: android.view.WindowLeaked:活动 com.TestCasesActivity 有漏窗 com.android.internal.policy.impl.PhoneWindow$DecorView{31a83555 V.E..... R......D 0,0-1026,348} 最初添加在这里 在 android.view.ViewRootImpl.(ViewRootImpl.java:363) 在 android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:262) 在 android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69) 在 android.app.Dialog.show(Dialog.java:298) 在 com.TestCasesActivity$ConfigParser.onPreExecute(TestCasesActivity.java:41) 在 android.os.AsyncTask.executeOnExecutor(AsyncTask.java:587) 在 android.os.AsyncTask.execute(AsyncTask.java:535) 在 com.TestCasesActivity.onCreate(TestCasesActivity.java:30) 在 android.app.Activity.performCreate(Activity.java:5984) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2254) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2361) 在 android.app.ActivityThread.access$800(ActivityThread.java:147) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1281) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5232) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)

之前还有一个解析器导致的崩溃:

07-30 08:40:32.651  22982-23154/? E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
    Process: com.performance_tool, PID: 22982
    java.lang.RuntimeException: An error occured while executing doInBackground()
            at android.os.AsyncTask$3.done(AsyncTask.java:300)
            at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
            at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
            at java.util.concurrent.FutureTask.run(FutureTask.java:242)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)
     Caused by: org.w3c.dom.DOMException: Only one root element allowed
            at org.apache.harmony.xml.dom.DocumentImpl.insertChildAt(DocumentImpl.java:421)
            at org.apache.harmony.xml.dom.InnerNodeImpl.appendChild(InnerNodeImpl.java:52)
            at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:306)
            at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:128)
            at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:107)
            at com.XmlHelper.getNumberOfNodes(XmlHelper.java:29)
            at com.TestCasesActivity$ConfigParser.doInBackground(TestCasesActivity.java:46)
            at com.TestCasesActivity$ConfigParser.doInBackground(TestCasesActivity.java:33)
            at android.os.AsyncTask$2.call(AsyncTask.java:288)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)

【问题讨论】:

  • 在改变方向时是否崩溃??
  • 不行,活动一启动就崩溃了
  • 应用崩溃时请分享更多细节
  • TestCasesActivity 活动一启动就崩溃
  • 第二个错误日志中清楚地解释了,只允许一个根元素。这意味着,您的 xml 内容具有多个根元素。请检查您的 xml 内容,否则在此处发布 xml contnet。

标签: android


【解决方案1】:

我已经在我的项目中这样做了:

class CreaLista extends AsyncTask<String, Void, Void> {

        private ProgressDialog dialog;
        private IndiceActivity indiceActivity;

        public CreaLista(IndiceActivity indiceActivity) {
            this.indiceActivity = indiceActivity;

            context = indiceActivity;

            dialog = new ProgressDialog(context);
        }



        private Context context;

        protected void onPreExecute() {
            this.dialog.setMessage("Dati in caricamento");
            this.dialog.show();
        }

        @Override
        protected void onPostExecute(final Void success) {

            if (dialog.isShowing()) {
                dialog.dismiss();
            }

【讨论】:

    【解决方案2】:

    解决方案 1: 您应该在 onPostExecute 关闭进度对话框。像这样。

    protected void onPostExecute(...){
        // dismiss dialog here
        dialog.dismiss();
    }
    

    这一步你完成了吗?

    解决方案 2: 如果您在 onPostExecute 上完成了这一步,但仍然出现错误,请查看下面的下一个解决方案,

    像这样将你的上下文从 onCreate 方法传递给 AsyncTask,

    confParser.execute(TestCasesActivity.this);
    

    您的异步任务将如下所示,

        private class ConfigParser extends AsyncTask<Void, Void, Void> {
            private ProgressDialog dialog;
            Context context;
    
            public ConfigParser(Context context){
            this.context=context;
            }
    
            @Override
            protected void onPreExecute() {
                dialog = new ProgressDialog(context);
                dialog.setMessage("Loading TestCases Configuration...");
                dialog.show();
            }
    
           @Override
           protected void onPostExecute(...){
           // dismiss dialog here
           dialog.dismiss();
           }
    }
    

    【讨论】:

    • 感谢您的详细解释。我用更多代码和另一个致命错误更新了我的问题。
    • TestCasesActivity.this 就足够了。因为它是一个内部类。不需要解决方案2
    • @webgenius 新错误是由于解析 xml 时出现问题。检查
    • 是的,问题已解决。问题在于具有多个根元素的 XML。我修改了 XML,现在问题已解决。感谢所有的帮助。
    猜你喜欢
    • 2015-04-10
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多