【问题标题】:Android: TabActivity - add no Tabs before AsyncTask has finishedAndroid:TabActivity - 在 AsyncTask 完成之前不添加任何选项卡
【发布时间】:2023-03-13 19:00:01
【问题描述】:

我有一个实现 TabContentFactory 的 TabActivity,它在 onCreate() 中启动一个 AsyncTask 来获取选项卡的数据。当 AsyncTask 完成后, onPostExecute() 可以直接更新 UI 元素,对吧?这意味着,由于该方法在 UI 线程中运行,因此在访问 UI 元素时不需要进一步的线程同步?

无论如何,我遇到的问题是我的 UI 线程在 TabActivity 中调用 createTabContent() 而 AsyncTask 仍然很忙。我必须添加至少一个选项卡,否则我会收到 NullPointerException。但是,如何仅在 AsyncTask 完成并且 ProgressDialog 已关闭时才添加选项卡?

如果有人可以提供帮助,我会很高兴...

【问题讨论】:

    标签: android android-asynctask tabactivity ui-thread


    【解决方案1】:
    When the AsyncTask has finished, onPostExecute() could directly update the 
    UI-elements, right? Meaning, since that method runs in the UI-Thread no further 
    thread-synchronization would be required when accessing UI-elements?
    

    没错。

    Anyway, the problem I have is that my UI-Thread calls createTabContent() in the
    TabActivity while the AsyncTask is still busy.
    

    如果您需要在 AsyncTask 仍在后台运行时更新 UI,则覆盖 AsyncTask.onProgressUpdate(..),然后从 AsyncTask.doInBackground(..) 中调用 AsyncTask.publishProgress(..)。

    I have to add at least one tab, or I get a NullPointerException. But how do I 
    only add tabs when my AsyncTask has finished and the ProgressDialog has been 
    dismissed?
    

    我不明白这一点。能详细解释一下吗?

    不管怎样,注意这件事:

    1. 仅在完全创建 TabActivity 后启动 AsyncTask。从 onPostCreate() 而不是 onCreate() 开始。这可能是 NullPointerException 的来源。
    2. 您可以从 AsyncTask.onPostExecute(..) 中的 UI 线程更新任何活动
    3. 如果您需要在 AsyncTask 仍在后台运行时更新 UI,请从 AsyncTask.doInBackground(..) 中调用 AsyncTask.publishProgress(..)

    【讨论】:

    • 您好,感谢您的回答!你说我应该在 TabActivity 完全创建后才启动 AsyncTask - 这正是我的问题。我不想在 AsyncTask 完成之前显示任何选项卡。 :-/
    • 我忘了解释:一切正常,我只希望 UI-Thread 等待数据。我考虑用我的 5 个选项卡初始化 TabActivity,每个选项卡包含一个空的 ScrollView,然后在 AsyncTask.onPostExecute(..) 中向这些选项卡添加内容。但我不确定这是否可行......?
    • 它应该可以工作。您可以在小部件初始化后随时添加/更改内容。为了用户方便,您应该显示 ProgressBar 并在加载后将其替换为内容。您可以在内容可用时逐步更新(一个接一个标签)。见上文第 3 点。
    • 好的.. 我尝试并添加了 5 个标签。对于每个我调用 setContent(this),并在 createTabContent() 中简单地返回一个新的 ScrollView。但是该方法只调用一次,直到 TabActivity 完全创建。所以我在 tabHost.getTabContentView() 中只有一个孩子。 :-/ 是否可以强制调用 createTabContent(),以便我可以访问孩子?
    • 我检查了它,似乎一旦创建选项卡,选项卡内容就无法更改。一个标签甚至不能被删除(一次只能删除所有标签)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多