7

我有一个具有这种结构的活动:

FrameLayout
   ProgressBar
   ViewStub

ViewStub 在一个单独的线程中膨胀一个片段。我需要的是在片段加载时显示进度。问题是存根膨胀时 ProgressBar 没有旋转(在我的情况下大约半秒:这是一个沉重的片段)我已经尝试了一切:显示/隐藏视图,无效,在 ViewSwitchers 中显示它们......等等,什么都没有有效,一旦 ViewStub 膨胀,它就开始旋转,就像 ui 在膨胀时被冻结,但在另一个线程中执行它似乎并没有改善。我应该怎么办?

4

2 回答 2

4

片段必须在 UI 线程上加载,并且由于 UI 忙于片段,因此 ProgressBar 不会旋转。您需要将片段中的数据加载与 UI 内容分开。我会测试并检查到底是什么在运行并防止片段快速启动,我会使用加载器来加载数据,同时向用户呈现进度条(在片段内)。是的,将进度移动到片段的布局并从那里控制一切,因为我不知道活动何时完成加载片段,活动不应该关心这一点。

于 2015-06-10T16:38:07.803 回答
1

基本上@Luksprog 在他的评论中所说的是正确的,如果你调用 viewStub.post() 这不会在后台线程上运行帖子内的代码。它所做的只是将 runnable 发布到 UI 线程。如果你这样做,它可能会起作用

new Thread(new Runnable() {
    @Override
    public void run() {
        viewStub.inflate();
        initFragment();
    }
}).start()

尽管正如@Luksprog 还指出的那样-在后台线程上实例化视图是一种不好的做法。因此,也许最好的解决方案是将 .inflate() 调用移到外部(到主线程上),然后从后台线程调用 initFragment() 并将所有繁重的工作放在那里。

于 2015-06-16T23:59:59.513 回答