线程:
你可以在不影响UI线程的情况下使用新的线程来执行长期运行的后台任务。从java线程,你不能更新UI线程。
由于普通线程在Android架构中用处不大,因此引入了线程的辅助类。
您可以在线程性能文档页面中找到查询的答案。
处理程序:
Handler允许您发送和处理与线程的MessageQueue关联的Message和Runnable对象。每个Handler实例都与单个线程和该线程的消息队列相关联。
Handler有两个主要用途:
将消息和可运行程序安排在未来的某个时间点执行;
将要在与自己的线程不同的线程上执行的操作排队。
AsyncTask:
AsyncTask允许正确和简单地使用UI线程。该类允许您执行后台操作并在UI线程上发布结果,而无需操作线程和/或处理程序。
缺点:
默认情况下,应用程序将它创建的所有AsyncTask对象推入一个线程。因此,它们以串行方式执行,与主线程一样,一个特别长的工作包会阻塞队列。由于这个原因,使用AsyncTask来处理持续时间短于5毫秒的工作项。
AsyncTask对象也是隐式引用问题的最常见的肇事者。AsyncTask对象也存在与显式引用相关的风险。
HandlerThread:
您可能需要一种更传统的方法来在长时间运行的线程上执行工作块(不像AsyncTask,它应该用于5ms的工作负载),并且需要一些手动管理工作流的能力。处理程序线程实际上是一个长时间运行的线程,它从队列中获取工作并对其进行操作。
ThreadPoolExecutor:
该类管理一组线程的创建,设置它们的优先级,并管理如何在这些线程之间分配工作。随着工作负载的增加或减少,该类将启动或销毁更多的线程以适应工作负载。
如果工作负载比较大,单个HandlerThread不够用,那么可以使用ThreadPoolExecutor
然而,我想有一个套接字连接运行在服务。这应该运行在一个处理程序或线程,甚至一个AsyncTask?UI交互根本不需要。它对我使用的性能有影响吗?
因为UI交互不是必需的,你可能不需要AsyncTask。普通线程用处不大,因此HandlerThread是最好的选择。因为你必须维护套接字连接,主线程上的Handler一点用都没有。创建一个HandlerThread并从HandlerThread的循环程序中获取一个Handler。
HandlerThread handlerThread = new HandlerThread("SocketOperation");
handlerThread.start();
Handler requestHandler = new Handler(handlerThread.getLooper());
requestHandler.post(myRunnable); // where myRunnable is your Runnable object.
如果希望与UI线程通信,可以使用另外一个Handler来处理响应。
final Handler responseHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
//txtView.setText((String) msg.obj);
Toast.makeText(MainActivity.this,
"Foreground task is completed:"+(String)msg.obj,
Toast.LENGTH_LONG)
.show();
}
};
在Runnable中,您可以添加
responseHandler.sendMessage(msg);
关于实现的更多细节可以在这里找到:
Android:在线程中吐司