【问题标题】:java.lang.IllegalStateException when adding a View in debug mode在调试模式下添加视图时出现 java.lang.IllegalStateException
【发布时间】:2011-05-30 04:24:37
【问题描述】:

我正在使用 AsyncTask,但在 onProgressUpdate 方法中出现以下错误:

java.lang.IllegalStateException: 指定的孩子已经有一个父母。 您必须在 首先是孩子的父母。在 android.view.ViewGroup.addViewInner(ViewGroup.java:1970) 在 android.view.ViewGroup.addView(ViewGroup.java:1865) 在 android.widget.TableLayout.addView(TableLayout.java:418)

我知道这个错误意味着什么以及如何解决它。我不明白为什么我只在调试模式下收到此错误。将 Thread.Sleep(1000) 添加到 doInBackground 方法实际上可以解决问题,但出于明显的性能原因,我不能添加它。 以下是我的 AsyncTask 中发生的事情的要点:

 protected Void doInBackground(Void... params) {

    row1 = TableVisuals.createRow(context, flag);
    tv1 = TableVisuals.getTextView(context, Info[0]);
    row2 = TableVisuals.createRow(context, flag);
    tv2 = TableVisuals.getTextView(context, Info[1]);
    publishProgress(i,0);

}

protected void onProgressUpdate(Integer... value) {

table.addView(row1);
row1.addView(tv1, 0, span);
table.addView(row2);
row2.addView(tv2, 0, span);

dialog.setProgress(value[0]);

}

请记住,上述代码的任何部分都不会发生 IllegalStateException。它在某些地方不一致,但几乎总是发生。我希望后台线程有一种方法可以等待 Thread.Sleep() 以外的 UI 线程,因为在某些情况下它似乎添加视图的速度太快了。

【问题讨论】:

    标签: android debugging android-asynctask


    【解决方案1】:

    为什么不将 View 创建移到任务之外,或者可能在 onProgressUpdate 中,因为它在 UI 线程上运行,而 doInBackground 不是。

    【讨论】:

    • 嗯,问题是我有大约 30 个视图创作,其中一些有一些附加工作,例如从数据库中抓取联系人同步的 facebook 照片的图像视图。对我来说,这可能是糟糕的编码,但是将这 30 个视图的创建放入 UI 线程实际上会使结果不一致且参差不齐。
    猜你喜欢
    • 1970-01-01
    • 2018-07-22
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多