我需要了解 Looper 。 Looper将咨询适当的处理程序以发送和处理与线程的MessageQueue相关联的Message和Runnable对象。
默认情况下,线程没有与之关联的消息循环,因此也没有Looper。要为线程创建Looper并将该线程专门用于从消息循环中串行处理消息,您可以使用Looper类。
以下是我的代码,我没有明确调用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();
}
});
他们都访问相同的处理程序。他们都工作正常。
答案 0 :(得分:2)
为Looper
创建Thread
表示您正在设置Thread
以接收来自其他Thread
的消息。您的两个示例都表现完全相同,因为您没有向第二个示例中的Thread
发送任何内容。也就是说,background3
的{{1}}并未真正使用。
在这两个示例中,您都是为Looper
的主Runnable
Handler
发布了Thread
。您没有为Looper
创建Handler
,例如background2
。 Handler
属于主Thread
及其Looper
,您发布到其中的任何内容都将放入主队列,并在主Thread
上运行。
您的示例中唯一的区别是第二个Thread
有一个Looper
,如果您愿意,可以发布到其中。为此,您需要创建属于Handler
background3
的另一个Looper
,并发布到该Thread
。但是,你不是那样做的,所以第二个Thread
只是继续运行而没有做任何其他事情。
Looper
不需要Thread
只需发布到另一个 Thread
的处理程序,这就是您的示例所做的一切。另一个Thread
- 主Looper
,在这种情况下 - 已经准备并启动了它的Runnable
。您只需向Looper
发送public IQueryable<UserDto> GetAllUser()
{
return _context.User.Select(u => new UserDto{FirstName=u.FirstName, LastName=u.LastName, Organisation="Acme"});
}
,而您自己不需要DROP PROCEDURE IF EXISTS `my_test`;
CREATE PROCEDURE `my_test`(
IN my_in_var VARCHAR(255),
OUT my_out_var VARCHAR(255)
)
BEGIN
IF(in_var == 'my_in_value') THEN
SET my_out_var = 'my_out_value1';
ELSE
SET my_out_var = 'my_out_value2';
END IF;
END
。