我使用线程来运行它。通常我会编写一个扩展Thread并实现run方法的类。
1.如果可以在Thread的run方法中写入背景代码,那么Runnable的意义何在?
使用Runnable和从Runnable创建线程是一般做法。
从Oracle教程concurrency关于Runnable
Vs的Thread
用法:
Runnable对象,是较为一般,因为Runnable对象可以继承比其他线程的一类。
2.线程内部如何使用Handler,为什么我们需要使用它。
这是一个广泛的话题来解释。在从官方文档网站简单来说:
Handler允许您发送和处理与线程的MessageQueue
相关Message
和Runnable
对象。每个Handler
实例都与单个线程和该线程的消息队列相关联。
当你创建一个新的Handler
,它绑定到创建它的线程的线程/消息队列 - 从,将邮件传递和可运行到消息队列,并执行它们作为点他们走出消息队列。
Handler
有两个主要用途:(1)安排消息和可运行子程序作为将来某个点执行;和(2)排队要在不同于自己的线程上执行的动作
为应用程序创建进程时,其主线程专用于运行消息队列,该消息队列负责管理顶层应用程序,高级应用程序对象(活动,广播接收器等)以及它们创建的任何窗口。 您可以创建自己的线程,并通过Handler与主应用程序线程进行通信。这是通过调用与之前相同的帖子或sendMessage
方法完成的,但是来自新线程。给定的Runnable
或消息将被安排在处理程序的消息队列中并在适当的时候处理。
这幅来自blog.mindorks.com的图片Anishar Ali的文章清楚地解释了概念。
3.Android有另一件事叫runOnUiThread,我们如何使用呢?我知道它用于更新用户界面。
你可以寻找到实现runOnUiThread
/**
* Runs the specified action on the UI thread. If the current thread is the UI
* thread, then the action is executed immediately. If the current thread is
* not the UI thread, the action is posted to the event queue of the UI thread.
*
* @param action the action to run on the UI thread
*/
public final void runOnUiThread(Runnable action) {
if (Thread.currentThread() != mUiThread) {
mHandler.post(action);
} else {
action.run();
}
}
请参阅以下职位Handler
使用的示例代码了解详情。
Android: Toast in a thread
我不知道很多有关处理程序和UniThread,因此评论没有回答,但通常你只会永远做Runnable接口的实现。如果你想改变推理的话,你通常只会扩展线程 –
我不能多说关于Android的细节,但是你使用'Runnable',因为它给你更多的灵活性来安排你正在运行的工作。直接使用'Thread'意味着你被困在一个特定的策略中。 – chrylis
如果你能向我展示一些例子,那将会很棒。 –