在正式介绍了并发性之后,我对并发性感到相当满意。由于我是android新手,我开始编写一个简单的活动,它连续递归调用自己10次,并打印递归的深度。
整个代码包含在oncreate方法中:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Get recursion count
Intent wasStartedWith = getIntent();
final int cnt = wasStartedWith.getIntExtra("count", 0);
// Update UI
runOnUiThread(new Runnable() {
@Override
public void run() {
TextView tv = findViewById(R.id.textView);
tv.setText(cnt + "th recursive call");
}
});
// Sleep 500ms before (possible) recursive call
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
// Check if non-basecase
if (cnt != 10)
{
// Recursive call
Intent recursiveIntent = new Intent(this, MainActivity.class);
recursiveIntent.putExtra("count", cnt + 1);
startActivity(recursiveIntent);
}
}
考虑到该方法的顺序性,我希望执行顺序如下:
从启动器调用的活动
runonuithread被调用时,runnable对象被传递给ui线程,该线程同时更新textview
主线程(!=ui线程)休眠500毫秒
主线程,假设它没有被中断,检查它是否是第10个递归调用。如果没有,它将创建一个新的意图,填充一个额外的意图并分派它。
转到2
令人困惑的是,我在打开应用程序时出现了非常奇怪的行为:
屏幕是空白的,甚至没有标题栏显示
几百毫秒后,屏幕会短暂地闪烁几毫秒预期的内容
转到1
在这个执行过程中,在第2步(1、3、5、7、9、10)中,实际上几乎每秒钟都会显示一次递归调用。
我的问题:
既然ui线程同时运行(即不受主线程的thread.sleep()的影响),为什么在活动启动时屏幕没有画对呢?
我应该怎么做才能得到预期的行为?
暂无答案!
目前还没有任何答案,快来回答吧!