调用Handler时是否需要调用Looper.prepare()
Do we need invoking Looper.prepare() when invoking Handler
我需要了解 Looper。 Looper 将参考适当的 handler 来发送和处理与线程的 MessageQueue 关联的 Message 和 Runnable 对象。
默认情况下,线程没有与之关联的消息循环,因此也没有 Looper。要为线程创建 Looper 并使该线程专用于从消息循环中串行处理消息,您可以使用 Looper class.
以下是我的代码我没有显式调用 Looper
Thread background2 = new Thread(new Runnable() {
@Override
public void run() {
for ( int i = 0; i < 5; i++) {
final int v =i;
try { Thread.sleep(1000);
handler.post(new Runnable() {
@Override
public void run() {
txt.setText(txt.getText() + "Thread 2 current i : " + String.valueOf(v) +System.getProperty("line.separator"));
}
});
} catch (Exception e) {
Log.v("Error", e.toString());
}
}
}
});
是否表示task/runnable没有放入队列?上面的代码和这个有什么区别
Thread background3 = new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();
for ( int i = 0; i < 5; i++) {
final int v =i;
try { Thread.sleep(1000);
handler.post(new Runnable() {
@Override
public void run() {
txt.setText(txt.getText()+ "Thread 3 set : " + String.valueOf(v) +System.getProperty("line.separator"));
}
});
} catch (Exception e) {
Log.v("Error", e.toString());
}
}
Looper.loop();
}
});
他们都访问 相同的处理程序。他们都工作得很好。
为 Thread
创建 Looper
意味着您正在设置 Thread
以接收来自其他 Thread
的消息。您的两个示例的行为完全相同,因为您没有向第二个示例中的 Thread
发送任何内容。也就是说,background3
的 Looper
并没有真正被使用。
在这两个示例中,您都post将 Runnable
转换为 Handler
,后者是为主要 Thread
的 Looper
创建的。您不是为 background2
创建 Handler
。 Handler
属于主 Thread
和它的 Looper
,任何你 post 到它的东西都会被放入主队列,而 运行 在主队列中Thread
.
你的例子中唯一的区别是第二个 Thread
有一个 Looper
,你 可以 post 到它,如果你想。为此,您将创建另一个属于 background3
的 Looper
的 Handler
,以及 post 的 post。但是,您没有这样做,所以第二个 Thread
只是继续 运行,没有做任何其他事情。
A Thread
不需要 Looper
只需 post 到 另一个 Thread
的处理程序,它真的是你的例子所做的一切。另一个 Thread
- 主要 Thread
,在这种情况下 - 已经准备好并开始其 Looper
。您只需向它发送 Runnable
,您不需要自己的 Looper
即可。
我需要了解 Looper。 Looper 将参考适当的 handler 来发送和处理与线程的 MessageQueue 关联的 Message 和 Runnable 对象。
默认情况下,线程没有与之关联的消息循环,因此也没有 Looper。要为线程创建 Looper 并使该线程专用于从消息循环中串行处理消息,您可以使用 Looper class.
以下是我的代码我没有显式调用 Looper
Thread background2 = new Thread(new Runnable() {
@Override
public void run() {
for ( int i = 0; i < 5; i++) {
final int v =i;
try { Thread.sleep(1000);
handler.post(new Runnable() {
@Override
public void run() {
txt.setText(txt.getText() + "Thread 2 current i : " + String.valueOf(v) +System.getProperty("line.separator"));
}
});
} catch (Exception e) {
Log.v("Error", e.toString());
}
}
}
});
是否表示task/runnable没有放入队列?上面的代码和这个有什么区别
Thread background3 = new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();
for ( int i = 0; i < 5; i++) {
final int v =i;
try { Thread.sleep(1000);
handler.post(new Runnable() {
@Override
public void run() {
txt.setText(txt.getText()+ "Thread 3 set : " + String.valueOf(v) +System.getProperty("line.separator"));
}
});
} catch (Exception e) {
Log.v("Error", e.toString());
}
}
Looper.loop();
}
});
他们都访问 相同的处理程序。他们都工作得很好。
为 Thread
创建 Looper
意味着您正在设置 Thread
以接收来自其他 Thread
的消息。您的两个示例的行为完全相同,因为您没有向第二个示例中的 Thread
发送任何内容。也就是说,background3
的 Looper
并没有真正被使用。
在这两个示例中,您都post将 Runnable
转换为 Handler
,后者是为主要 Thread
的 Looper
创建的。您不是为 background2
创建 Handler
。 Handler
属于主 Thread
和它的 Looper
,任何你 post 到它的东西都会被放入主队列,而 运行 在主队列中Thread
.
你的例子中唯一的区别是第二个 Thread
有一个 Looper
,你 可以 post 到它,如果你想。为此,您将创建另一个属于 background3
的 Looper
的 Handler
,以及 post 的 post。但是,您没有这样做,所以第二个 Thread
只是继续 运行,没有做任何其他事情。
A Thread
不需要 Looper
只需 post 到 另一个 Thread
的处理程序,它真的是你的例子所做的一切。另一个 Thread
- 主要 Thread
,在这种情况下 - 已经准备好并开始其 Looper
。您只需向它发送 Runnable
,您不需要自己的 Looper
即可。