学习思考的事件而言确实是这里的关键,您可以做到这一点:)
的第一条规则是:永远不要拖延UI线程。 UI线程负责保持您的应用程序的响应。你在那里做的任何工作都不应该阻止;尽你所能去做并尽快回复。绝对避免在UI线程上执行I/O操作。 (有一些地方,你不能真正帮助它因生命周期的要求,例如节省应用状态。)如果你曾经的 UI线程上调用Thread.sleep
你做错了。
的Android强制执行此与“应用程序没有响应”(或“ANR”)错误用户看到。每当你在Android应用程序中看到它时,这意味着开发者做了一些事情导致UI线程停顿太久。如果设备由于某种原因真的陷入困境,这个错误可能实际上并不是应用程序开发者的错,但通常这意味着该应用程序出错了。
您可以通过发布自己的活动来使用此模型。这给你一个简单的方式来告诉你的应用,“稍后再做”。在Android中发布您自己的活动的关键在Handler
类。方法postDelayed
可以让您安排Runnable
,它将在一定的毫秒数后执行。
如果你有一个看起来像这样的活动:创建活动,则5秒后
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();
}
}
,你会看到在doStuff
创建的敬酒。
如果你正在写一个自定义的View
那就更简单了。视图有自己的postDelayed
方法,可以将所有内容发布到正确的Handler
,而且您不需要创建自己的。
第二条规则是:视图应该只有在UI线程上被修改。那些你得到和忽略的例外意味着出了问题,如果你忽略它们,你的应用程序可能会以有趣的方式开始行为不端。如果您的应用程序在其他线程中执行大部分工作,则可以将post
事件直接发送到要修改的视图,以便修改能够正确运行。
如果您从代码的该部分引用了您的Activity
,则还可以使用Activity#runOnUIThread
,这正如其名称所暗示的。如果张贴到单个视图在上下文中没有意义,您可能更喜欢这种方法。
至于更新视图才会出现,直到您按下按钮,这些视图是什么样的?他们是否正在绘制这些更新的自定义视图?如果是这样,你是否记得在数据更改后调用invalidate
来触发重绘?视图仅在其失效后重新绘制。
那么看到我的方式的错误是,我试图修改在不断运行的不同线程的视图,以便UI不会锁定...因为我不知道如何通过由我运行的线程生成的值...传递给UI。虽然令人难以置信的有帮助,但我非常感谢您的支持 – 2010-11-06 22:03:21
使用AsyncTask – Falmarri 2010-11-07 07:23:55