Runnable 并不一定是新开一个线程,比如下面的调用方法就是运行在UI主线程中的:
Handler mHandler=new Handler();
mHandler.post(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
}
});官方对这个方法的解释如下,注意其中的:“The runnable will be run on the user interface thread. ”
boolean android.view.View .post(Runnable action)
Causes the Runnable to be added to the message queue. The runnable will be run on the user interface thread.
Parameters:
action The Runnable that will be executed.
Returns:
Returns true if the Runnable was successfully placed in to the message queue. Returns false on failure, usually because the looper processing the message queue is exiting.
我们可以通过调用handler的post方法,把Runnable对象(一般是Runnable的子类)传过去;handler会在looper中调用这个Runnable的Run方法执行。
Runnable是一个接口,不是一个线程,一般线程会实现Runnable。
[size=medium][/size]
这里我们看代码 mHandler.post(new Runnable(){ 好像是new 了一个 interface, 其实是new的一个实现Runnable的匿名内部类(Inner Anonymous Class),这是很简练的写法。
上面的代码可以看成是: new anonymousClass() implement interface{ [改写interface method]}
Runnable是一个接口,不是一个线程,一般线程会实现Runnable。 所以如果我们使用匿名内部类是运行在UI主线程的,如果我们使用实现这个Runnable接口的线程类,则是运行在对应线程的。
分享到:
相关推荐
任何实现了Runnable接口的类都可以创建一个Runnable对象,然后将这个对象传递给Handler的`post()`或`sendMessage()`方法,使得`run()`方法能在Handler的关联线程中执行。 `Looper`是Android消息循环的核心,它负责...
`Handler.post(Runnable)`方法是将一个Runnable对象放入消息队列,这个Runnable对象通常包含需要在UI线程中执行的代码。当主线程空闲时,它会取出队列中的Runnable并执行其`run()`方法。这样,我们就可以在后台线程...
* 创建一个Handler对象,使用Handler对象h把Runnable的对象r压入队列 * 此时只会会执行Run()方法,但是不会开启新的线程 */ //Handler h = new Handler(); //h.post(r); /* * 在java中真正开启...
总结起来,这个`android demo`提供了一个实用的示例,帮助开发者掌握如何在Android环境中利用`Runnable`和`Handler`实现定时任务。这种技术在游戏、实时数据刷新、动画以及其他需要定时执行操作的场景下都非常常见。...
例如,在上面的示例中,我们创建了一个 Handler 对象,并在其上执行一个 Runnable 对象,该对象将在控制台输出一串字符串,并且每隔 3 秒再执行一次线程,直到点击 end 按钮为止,线程停止。 Handler 的使用可以...
`post(Runnable r)`方法允许你在主线程中异步执行一个任务,这对于更新UI特别有用: ```java handler.post(new Runnable() { @Override public void run() { // 在主线程中执行的操作 } }); ``` 在实际项目中...
在Android开发中,`Handler`是一个至关重要的组件,主要用于解决线程间的通信问题,尤其是在UI线程和其他工作线程之间。本篇文章将深入探讨`Handler`的使用方法,包括其基本概念、工作原理以及如何避免内存泄露和...
这个线程的执行由一个Runnable对象控制,并通过Handler的`post()`方法将其放入消息队列。点击end按钮时,通过Handler的`removeCallbacks()`方法移除Runnable,停止线程的执行。 这个例子展示了Handler如何与...
`sendMessage()`通常用于发送带有特定命令的消息,而`post(Runnable r)`常用于执行一个Runnable对象。 3. **处理消息**: 在Handler的`handleMessage(Message msg)`方法中编写处理逻辑。msg对象包含了消息的标识、...
除了发送Message外,Handler还提供了一个`post(Runnable)`方法,用于在主线程中执行Runnable对象。这种方式更简洁,但无法像Message那样携带复杂的数据结构。 6. **Looper.quit()和Looper.quitSafely()** 当我们...
在上述代码中,我们看到了如何使用Handler和Runnable来实现一个简单的线程启动和停止的逻辑,同时通过postDelayed方法实现了一个延时任务的循环执行。这种模式在Android开发中非常常见,它体现了Android UI编程的单...
当我们在主线程中创建一个Handler实例时,这个Handler会自动与当前线程的Looper绑定。我们可以通过Handler发送Message对象到消息队列,Looper会按照先进先出(FIFO)的规则将这些消息传递给Handler来处理。 创建...
程序中,在负线程中默认加了一个3s的线程等来,来帮助理解sent message和post runnable之间的同步机制。所以在按按钮后,会等待3s后显示VIEW才会有打印输出,如果理解了Looper的同步机制后,可以删除3s等待和主线程...
子线程通过调用 `sendMessage()` 或 `post()` 方法将 `Message` 对象或 `Runnable` 对象发送到 Handler,这些对象随后会被添加到主线程的消息队列中。主线程中的 Looper 循环不断地取出队列中的消息并交给关联的 ...
handler发送和接收message的各种方式 (1)Handler.SendEmptyMessage(what); (2)Handler.obtainMessage(int what, int arg1, int arg2, Object obj).sendYToTarget();...(5)handler.post(Runnable callback)
1. 首先,在主线程中创建一个Handler实例,并重写handleMessage()方法。在这个方法中,我们会处理来自其他线程的消息,更新UI。 ```java public class MainActivity extends AppCompatActivity { private Handler ...
在Android系统中,每个线程都有一个Looper,它是消息队列的管理者,负责取出Message并分发给相应的Handler进行处理。 主线程(UI线程)默认已经启用了Looper,因此可以直接创建Handler。创建Handler时通常需要重写`...
通常,我们在主线程中创建一个Handler实例,然后在其他线程中通过这个Handler发送消息。Handler有`handleMessage(Message)`方法,当接收到消息时,该方法会在主线程中被调用,从而安全地更新UI。 以下是使用Thread...
在Android中,每个线程都有一个Looper,它是消息队列的管理者,不断从消息队列中取出消息并分发给相应的Handler进行处理。 在Handler的使用过程中,通常需要完成以下三个步骤: 1. **创建Handler实例**: 在主线...
`Handler`类是Android中的一个核心组件,它与`Looper`和`MessageQueue`一起构成了Android的消息处理系统。在Android应用启动时,主线程(也称为UI线程)会默认创建一个`Looper`对象,该`Looper`会不断循环地从`...