我的问题是Thread
和Handler
Q1)它们的作用是什么?1)活动2)服务
Q2)在他们的生命周期中,他们之间有什么区别 我正在使用以下代码。
1)---------------------------
final Handler handler = new Handler();
Runnable runnable = new Runnable()
{
public void run()
{
// do somthing
handler.postDelayed(this, 1000);
}
};
runnable.run();
2)---------------------------
handler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
super.handleMessage(msg);
}
};
new Thread(new Runnable()
{
public void run()
{
while(true)
{
try
{
Thread.sleep(1000);
handler.sendEmptyMessage(0);
} catch (InterruptedException e) {}
}
}
}).start();
答案 0 :(得分:1)
处理程序: handler用于执行 looper thing.that执行相同的任务次数。 处理程序可以在主线程上执行。
关于Handler如果在服务中使用它可能会在手机状态变为睡眠时停止。 如果在活动中使用,你可以通过处理程序更新UI。
主题: 线程用于分开上的事物而不是活动的主线程。
即使手机状态变为睡眠模式,线程也始终在后台运行。 u 无法更新UI 因为它没有在主线程上运行。可以使用asynctask而不是使用简单的java线程来完成。
答案 1 :(得分:0)
可以使用Handler通知一个线程来自另一个线程的事件。
典型用法是从其他线程通知UI线程。
我们无法直接修改其他线程的UI元素。因此,我们可以将Handler定义为Activity的成员。 在UI线程上创建活动,因此该处理程序也在UI线程上。 然后从另一个线程我们向Handler发送一条消息。收到消息后,Handler会修改一些UI元素。
答案 2 :(得分:0)
Q0)线程与处理程序有什么区别?
Thread是the same as it always is in programming。每个线程执行一次对方法的调用,然后终止。每个线程与每个其他线程并行运行。线程就像你一次发生多个事情一样。
在线程之间传递信息是notoriously difficult ...
Handler是Android将消息从一个线程传递到另一个线程的方式。具体来说,它允许您将一组指令作为Runnable传递给线程以执行该线程。通常,它们用作线程在完成时将结果报告回主线程的方式。
Q1)它们的作用是什么?1)活动2)服务
这两个项在服务中的行为方式或一般 除 之外的活动之间没有区别,服务可以存在于自己的process中如果android是instructed to do so。不同进程中的线程不能直接相互通信。服务用于共享数据,功能以及在某些情况下共享活动之间的线程。没有要求他们拥有自己的主题。
需要注意的一点是,只有main
线程可以更新UI(活动)。
另外,网络也可以不在主线程上完成。网络通常在服务中完成,以便可以共享结果,但这不是必需的。
围绕主线程必须做和不得做的限制使线程变得有点棘手,但这些限制可以帮助您避免意外冻结UI。
Q2)在他们的生命周期中,他们之间有什么区别我使用以下代码。
很难回答,因为我不了解您的代码的目的。
举个例子。 Android不再允许您在主线程上进行任何网络连接,因为这可能会在等待服务器通过可怜的WiFi连接进行响应时冻结UI。要根据从网络中检索到的内容更改UI上的内容,您必须使用线程进行网络连接并将数据传递回主线程以更新UI。
我的代码中的(doctored)代码段如下所示:
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
由onCreate中的main
线程创建并启动。这一直存在,直到它从网络中检索数据并将响应发布回main
线程。然后就完成了。
检索完所有数据后,uiUpdate
创建Runnable networkThread
。它没有关联的线程,因此不会立即执行。而是使用处理程序将其发回main
。然后在主线程上执行它并在完成后丢弃。