Q0) 线程和处理程序有什么区别?
线程与编程中始终相同。每个线程对方法执行一次调用,然后终止。每个线程与其他所有线程并行运行。简而言之,线程是您同时发生不止一件事的方式。
在线程之间传递信息是出了名的困难......
处理程序是 Android将消息从一个线程传递到另一个线程的方式。具体来说,它允许您将一组指令作为Runnable传递到线程中以供该线程执行。通常,它们用作线程在完成时将其结果报告回主线程的一种方式。
Q1) 当它们用于 1) Activity 2) Service 时有什么作用
这两个项目在服务或活动中的行为方式一般没有区别,除非服务可以存在于它自己的进程中,如果 android 被指示这样做。不同进程中的线程不能直接相互通信。服务用于共享数据、功能以及在某些情况下活动之间的线程。他们不需要拥有自己的线程。
需要注意的主要一点是,只有main
线程可以更新 UI(活动)。
此外,网络也不能在主线程上完成。联网通常在服务内部完成,以便可以共享结果,但这不是必需的。
在主线程中必须和不能做的事情的限制使线程有点棘手,但这些限制可以帮助您避免意外冻结 UI。
Q2)他们之间在他们的寿命方面有什么区别我正在为他们使用以下代码。
很难回答,因为我不明白你的代码的目的。
举个例子。Android 不再允许您在主线程上进行任何联网,因为这可能会在等待服务器通过较差的 wifi 连接响应时冻结 UI。要根据从网络检索到的内容更改 UI 上的内容,您必须使用线程来进行网络连接并将数据传回主线程以更新 UI。
我的代码中的(篡改)片段如下所示:
private final Handler handler = new Handler();
@Override
protected void onCreate( Bundle savedInstanceState ) {
// irreverent to the example
super.onCreate(savedInstanceState);
super.setContentView(R.layout.abstract_main_view);
// Here's the example
Thread networkThread = new Thread() {
@Override
public void run() {
// This could take several seconds
final Collection<Player> players = service.lookupAllPlayers();
Runnable uiUpdate = new Runnable() {
@Override
public void run() {
// This is quick, just adding some text on the screen
showPlayers(players);
}
};
handler.post(uiUpdate);
}
};
networkThread.start();
}
在这个例子中:
处理程序在此活动期间创建并存在。因为这个类是main
线程构造的,Handler也是。这意味着发布到此处理程序的所有消息都将由main
.
networkThread
由main
onCreate 中的线程创建并启动。这将一直存在,直到它从网络检索数据并将响应发布回main
线程。然后就完成了。
一旦检索uiUpdate
到所有数据,就会创建Runnable 。networkThread
它没有关联的线程,因此不会立即执行。相反,它被发布回main
使用处理程序。然后在主线程上执行并在完成后丢弃。