学会根据事件来思考确实是这里的关键。你可以的。:)
第一条规则是:永远不要使 UI 线程停止。UI 线程负责保持应用响应感。你在那里做的任何工作都不应该被阻止;做你需要做的事情,并尽快返回。绝对避免在UI线程上进行I / O。(由于生命周期要求,有些地方您无法真正帮助它,例如将应用程序状态保存在 .如果您曾经调用UI线程,那么您做错了。onPause
Thread.sleep
Android 会通过用户看到的“应用程序无响应”(或“ANR”)错误强制执行此命令。每当您在Android应用程序中看到此内容时,都意味着开发人员做了一些导致UI线程停滞太长时间的事情。如果设备由于某种原因确实陷入困境,则此错误实际上可能不是应用程序开发人员的错,但通常意味着应用程序做错了什么。
您可以通过发布自己的事件来使用此模型来发挥自己的优势。这为你提供了一种简单的方法来告诉你的应用,“稍后再执行此操作”。在 Android 中,发布自己的事件的密钥位于 Handler
类中。postDelayed
方法允许您计划将在特定毫秒数后执行的 Runnable
。
如果您的活动如下所示:
public class MyActivity extends Activity {
private Handler mHandler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mHandler.postDelayed(new Runnable() {
public void run() {
doStuff();
}
}, 5000);
}
private void doStuff() {
Toast.makeText(this, "Delayed Toast!", Toast.LENGTH_SHORT).show();
}
}
然后,在创建活动 5 秒后,您将看到 在 中创建的 toast。doStuff
如果您正在编写自定义内容,那就更容易了。视图有自己的 postDelayed
方法,该方法会将所有内容发布到正确的位置,您无需创建自己的方法。View
Handler
第二条规则是:只能在 UI 线程上修改视图。你得到和忽略的那些例外意味着出了什么问题,如果你忽略它们,你的应用程序可能会开始以有趣的方式表现不佳。如果你的应用在其他线程中完成大部分工作,你可以将事件直接发布到
要修改的视图,以便修改将正确运行。
如果您从代码的该部分引用了您的,则还可以使用Active#runOnUIThread
,它完全符合名称的含义。如果发布到单个视图在上下文中没有实际意义,则您可能更喜欢此方法。Activity
至于在点击按钮之前不显示的视图更新,这些是哪种视图?它们是绘制这些更新的自定义视图吗?如果是这样,您是否记得在数据更改后调用 invalidate
来触发重绘?视图仅在失效后重新绘制。