线程和处理程序之间的区别
difference between Thread and Handler
谁能告诉我线程和处理程序之间的区别?什么时候用Thread,什么时候用Handler?
我的项目中有两段代码,但是我看不懂。
final Handler handler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
// Do SomeThings
}
};
和
private class readThread extends Thread
{
Handler mHandler;
readThread(Handler h){
mHandler = h;
this.setPriority(Thread.MIN_PRIORITY);
}
@Override
public void run()
{
// Do SomeThings
}
}
然后在另一个方法中像这样调用处理程序
read_thread = new readThread(handler);
read_thread.start();
先运行哪个??有人可以解释一下吗?
相同:你们都可以异步执行任务而不会阻塞你们当前的代码,
区别:假设你有一个Runnable r = new Runnable{...}
当你使用new Thread(r).start()
时,你实际上是异步创建了一个新线程和运行任务。
当您使用 new Handler().post(r)
(或 Message
)时,您将 Runnable
对象添加到 Looper
并稍后在相同的位置执行代码线程.
一个Thread
,一般MainThread
或UIThread
包含一个Looper
。当MainThread
运行秒时,会循环Looper
,一条条执行Runnable
。
首选线程时:
当您进行网络通信或解码大型位图文件等繁重工作时,首选新线程。如果需要很多线程,可能 ExecutorService
更受欢迎。
https://developer.android.com/reference/java/util/concurrent/ExecutorService.html
首选Handler时:
当你想从其他线程更新UI对象(如TextView
文本)时,UI对象只能在UI线程中更新.
此外,当您稍后只想 运行 一些轻代码(例如延迟 300 毫秒)时,您可以使用 Handler
因为它更轻更快。
另请参阅Handler vs AsyncTask vs Thread
线程是可以完成大多数事情的通用处理任务,但它们不能做的一件事是更新 UI。
另一方面,处理程序是后台线程,允许您与 UI 线程通信(更新 UI)。
因此,例如通过发布到处理程序的消息 (Runnable) 显示祝酒词或更新进度条,但如果您将此 runnable 作为线程启动,则不能。
使用处理程序,您还可以进行 MessageQueuing、调度和重复等操作。
我还没有遇到需要线程的情况 android。
我主要结合使用 AsyncTasks 和 Handlers。
上述任务的处理程序。
AsyncTasks 用于下载/数据获取和轮询等
Thread
实际上创建新线程 - 作业的一部分 运行 在后台相对于当前线程。
Handler
本身不提供任何后台作业机制——它只是一个访问与某个线程关联的消息队列 (Looper
) 的工具。 UI 线程默认附加了 Looper
,所以通常的做法是用 Handler.post(Runable)
更新 UI,这意味着在与此 [=] 关联的线程上执行一些代码11=].
一旦 Handler
服务于 Looper
,就无法在没有关联 Looper
.
的线程中创建它
简单地说,
两者是相同的概念,但存在一些关键差异。
线程是一个 java(java.lang) 概念,处理程序是一个 android(android.os)OS concept.if 您使用的是 Handler 而不是 Thread ,您的 OS 将自动管理后台进程的工作。但是如果你使用的是Thread,它并不依赖于你的android OS。因此与 Handler 相比,Threads 无法有效地管理内存。
线程:
您可以将新线程用于长时间的 运行 后台任务,而不会影响 UI 线程。来自 java 线程。但是在这里你不能从 Thread.
更新 UI
由于普通线程对 Android 体系结构没有多大用处,因此引入了用于线程的辅助程序 classes。
您可以在线程性能文档页面上找到问题的答案。
处理程序:
这个class负责将任何任务排入消息队列并处理它们。每个处理程序都可以与一个线程和该线程的消息队列相关联。
处理程序有两个主要用途:
- 安排消息和可运行程序在某个时间点执行
未来;
- 将要在不同的设备上执行的操作排队
线程比你自己的。
Looper: Looper是一个保持线程存活的worker,它循环消息队列并将消息发送到相应的Handler。
Message Queue:这个class保存了looper发送的消息列表。您只需调用 Looper.myqueue() 即可获取消息列表。我们一般不处理。
谁能告诉我线程和处理程序之间的区别?什么时候用Thread,什么时候用Handler?
我的项目中有两段代码,但是我看不懂。
final Handler handler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
// Do SomeThings
}
};
和
private class readThread extends Thread
{
Handler mHandler;
readThread(Handler h){
mHandler = h;
this.setPriority(Thread.MIN_PRIORITY);
}
@Override
public void run()
{
// Do SomeThings
}
}
然后在另一个方法中像这样调用处理程序
read_thread = new readThread(handler);
read_thread.start();
先运行哪个??有人可以解释一下吗?
相同:你们都可以异步执行任务而不会阻塞你们当前的代码,
区别:假设你有一个Runnable r = new Runnable{...}
当你使用
new Thread(r).start()
时,你实际上是异步创建了一个新线程和运行任务。当您使用
new Handler().post(r)
(或Message
)时,您将Runnable
对象添加到Looper
并稍后在相同的位置执行代码线程.
一个Thread
,一般MainThread
或UIThread
包含一个Looper
。当MainThread
运行秒时,会循环Looper
,一条条执行Runnable
。
首选线程时:
当您进行网络通信或解码大型位图文件等繁重工作时,首选新线程。如果需要很多线程,可能 ExecutorService
更受欢迎。
https://developer.android.com/reference/java/util/concurrent/ExecutorService.html
首选Handler时:
当你想从其他线程更新UI对象(如TextView
文本)时,UI对象只能在UI线程中更新.
此外,当您稍后只想 运行 一些轻代码(例如延迟 300 毫秒)时,您可以使用 Handler
因为它更轻更快。
另请参阅Handler vs AsyncTask vs Thread
线程是可以完成大多数事情的通用处理任务,但它们不能做的一件事是更新 UI。
另一方面,处理程序是后台线程,允许您与 UI 线程通信(更新 UI)。
因此,例如通过发布到处理程序的消息 (Runnable) 显示祝酒词或更新进度条,但如果您将此 runnable 作为线程启动,则不能。
使用处理程序,您还可以进行 MessageQueuing、调度和重复等操作。
我还没有遇到需要线程的情况 android。
我主要结合使用 AsyncTasks 和 Handlers。
上述任务的处理程序。
AsyncTasks 用于下载/数据获取和轮询等
Thread
实际上创建新线程 - 作业的一部分 运行 在后台相对于当前线程。
Handler
本身不提供任何后台作业机制——它只是一个访问与某个线程关联的消息队列 (Looper
) 的工具。 UI 线程默认附加了 Looper
,所以通常的做法是用 Handler.post(Runable)
更新 UI,这意味着在与此 [=] 关联的线程上执行一些代码11=].
一旦 Handler
服务于 Looper
,就无法在没有关联 Looper
.
简单地说,
两者是相同的概念,但存在一些关键差异。 线程是一个 java(java.lang) 概念,处理程序是一个 android(android.os)OS concept.if 您使用的是 Handler 而不是 Thread ,您的 OS 将自动管理后台进程的工作。但是如果你使用的是Thread,它并不依赖于你的android OS。因此与 Handler 相比,Threads 无法有效地管理内存。
线程:
您可以将新线程用于长时间的 运行 后台任务,而不会影响 UI 线程。来自 java 线程。但是在这里你不能从 Thread.
更新 UI由于普通线程对 Android 体系结构没有多大用处,因此引入了用于线程的辅助程序 classes。 您可以在线程性能文档页面上找到问题的答案。
处理程序:
这个class负责将任何任务排入消息队列并处理它们。每个处理程序都可以与一个线程和该线程的消息队列相关联。
处理程序有两个主要用途:
- 安排消息和可运行程序在某个时间点执行 未来;
- 将要在不同的设备上执行的操作排队 线程比你自己的。
Looper: Looper是一个保持线程存活的worker,它循环消息队列并将消息发送到相应的Handler。
Message Queue:这个class保存了looper发送的消息列表。您只需调用 Looper.myqueue() 即可获取消息列表。我们一般不处理。