Android:在加载其他View内容时将图像闪烁到屏幕

时间:2011-04-03 21:09:33

标签: android android-layout

我在这个主题上看过few posts。这是我的策略;我有一个绘图应用程序,在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%的图纸和“典型”用例都可以正常工作,因为活动很快就会加载,几乎没有延迟。但是,对于非常复杂的图纸,延迟可能长达两秒。为了帮助解决这个问题,我尝试了一个AsyncTask,它适用于5%的过大图纸,但是对于其他95%看起来有点过分,实际上由于不得不开火使加载速度慢一些AsyncTask。这不是最糟糕的解决方案,但我正在寻找替代方案。

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

  1. 在onCreate()的开头加载一个临时的'splash'屏幕视图,使用静态图形作为占位符,用户可以在加载图形时立即查看。
  2. 启动有时很昂贵的loadDrawing()例程。
  3. 完成后,切换视图并使用包含loadDrawing()形状的完全交互式绘图画布显示辅助视图。
  4. 我的问题是,如果我大致如下对上述解决方案进行建模,则永远不会显示“启动”布局,并且在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);
        }
    }
    

1 个答案:

答案 0 :(得分:0)

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

你需要使用某种后台异步线程来实现这一点 - 这就是为什么AsyncTask可以在需要同时发生其他东西时绘制/操作UI的原因。