我在这个主题上看过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版本......所以我想要使用的解决方案是以下几行:
loadDrawing()
例程。loadDrawing()
形状的完全交互式绘图画布显示辅助视图。我的问题是,如果我大致如下对上述解决方案进行建模,则永远不会显示“启动”布局,并且在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);
}
}
答案 0 :(得分:0)
如果loadDrawing是Activity中的一个方法,它将阻止UI线程,直到它完成。简而言之,直到启动步骤(创建/启动/恢复)完成后才会显示UI。如果你将loadDrawing放在onResume中就没关系,因为它仍会阻止创建UI。
你需要使用某种后台异步线程来实现这一点 - 这就是为什么AsyncTask可以在需要同时发生其他东西时绘制/操作UI的原因。