【问题标题】:Android: Flashing image to screen while other View content is loadingAndroid:在加载其他视图内容时将图像闪烁到屏幕
【发布时间】:2011-04-04 06:02:03
【问题描述】:

我已经阅读了有关该主题的fewposts,。这是我的策略;我有一个绘图应用程序,它在 ListView 中显示用户创建的绘图。一旦用户选择了一个绘图,就会启动 DrawingEdit Activity,在 onCreate 中加载绘图,大致如下:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // set the layout for the activity
setContentView(R.layout.drawing_view);

    // do potentially expensive loading of drawing here
    loadDrawing();
}

loadDrawing() 正在从数据库中加载用户绘图的各个形状。现在,对于 95% 的图纸和“典型”用例,这可以正常工作,因为 Activity 加载速度很快,几乎没有延迟。但是,对于非常非常复杂的图纸,延迟可能长达两秒。为了帮助解决这个问题,我尝试了一个 AsyncTask,它适用于 5% 的过大绘图,但对于另外 95% 的绘图来说似乎有点过大,实际上由于必须触发而使加载速度变慢启动异步任务。这不是最糟糕的解决方案,但我正在寻找替代方案。

现在,除了我存储在数据库中的绘图数据之外,我还有一个可以使用的静态 PNG 版本的绘图...所以我想使用的解决方案是行:

  1. 在 onCreate() 开始时加载一个临时的“启动”屏幕视图,使用静态绘图作为占位符,用户可以在加载绘图时立即查看。
  2. 开始有时昂贵的loadDrawing() 例程。
  3. 完成后切换视图并使用包含来自loadDrawing() 的形状的完全交互式绘图画布显示辅助视图。

我的问题是,如果我将上述解决方案大致建模如下,则永远不会显示“splash”布局,并且在loadDrawing() 完成然后显示最终布局之前仍然存在相同的延迟。关于这里发生了什么的任何信息?我是否应该将 loadDrawing() 移动到 onResume 以便在触发 loadDrawing() 之前有机会加载初始启动 UI?

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // set the layout for the activity
setContentView(R.layout.splash_view);

    // do potentially expensive loading of drawing here
    if (loadDrawing()) {
      // set the layout for the activity
  setContentView(R.layout.drawing_view);
    }
}

【问题讨论】:

    标签: android android-layout


    【解决方案1】:

    如果 loadDrawing 是 Activity 中的一个方法,它会阻塞 UI 线程,直到它完成。简而言之,直到启动步骤(创建/启动/恢复)完成后才显示 UI。如果您将 loadDrawing 放在 onResume 中也没关系,因为它仍然会阻止 UI 创建。

    您需要使用某种后台异步线程来使其工作 - 这就是为什么 AsyncTask 有助于在需要同时发生其他事情的同时绘制/操作 UI。

    【讨论】:

    • 啊,好的,完美,在绘制 UI 时不是 100% 确定,这涵盖了它,谢谢。
    • @Paul:很高兴能提供帮助,不得不承认,当我第一次接触活动和 UI 线程时,这让我很困惑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    相关资源
    最近更新 更多