{
@Override
public void run()
{
System.out.println(Looper.myLooper().getThread()+"post");
textView.setText("alreadly changed");
}
});
各位大神求指教啊,new 一个runnable不是开启一个新线程么,为什么在这就不适用了呢。通过打印可以得出还是运行在main线程里面,也能更新UI主键。为啥是这样呢,为啥呢??
16 个解决方案
#1
handler.post(new Runnable()
{
@Override
public void run()
{
System.out.println(Looper.myLooper().getThread()+"post");
textView.setText("alreadly changed");
}
});
各位大神求指教啊,new 一个runnable不是开启一个新线程么,为什么在这就不适用了呢。通过打印可以得出还是运行在main线程里面,也能更新UI主键。为啥是这样呢,为啥呢??
我也不知道,帮你顶一下吧。。。
{
@Override
public void run()
{
System.out.println(Looper.myLooper().getThread()+"post");
textView.setText("alreadly changed");
}
});
各位大神求指教啊,new 一个runnable不是开启一个新线程么,为什么在这就不适用了呢。通过打印可以得出还是运行在main线程里面,也能更新UI主键。为啥是这样呢,为啥呢??
我也不知道,帮你顶一下吧。。。
#2
谁告诉你new Runnable()是开新线程的?
#3
java里面不都是这样,开线程要么是new一个thread要么是实现new Runnable接口。。。
#4
我也是新手,我的理解是handler.post是在线程需要用主线程执行代码段时使用,实现与主线程的同步,post下的代码在主线程中执行,不知道对不对
#5
找了下资料,原来handler.post还真不是开新线程message.callback.run();最后handler的调用是run方法不是start方法。
但是这样又有一个问题了,post的意义何在?既然不是新线程直接在主线程做这些操作就可以了啊,为啥还弄个post方法?
#6
我的理解是这个post就是和ui线程打交道的快速通道,因为很多时候handler都不是主线程里面,用post就能快速更新UI界面了。
#7
Handler是绑定到创建它的主线程中的,Handler跟UI主线程是同一个线程。Handler的作用:主要是在其他后台线程中,通过handler这个媒介,向UI主线程发送Runnable对象(即代码段)
#8
textView.setText("alreadly changed");
不能再异步线程里面更新ui界面
不能再异步线程里面更新ui界面
#9
handler.post应该是在主线程下执行的 ,不是另外新开线程 我觉得
#10
handler.post应该是在主线程下执行的
#11
你需要修改handler默认的looper.
#12
这个说的对,,,
#13
看下源码就很清楚了,view.post(Runnable)内部实际还是使用的handler.post(Runnable),而这个方法,内部会执行下面的方法,从而把Runnable设置为Message.callback,实际上相当于handler.sendMessage(),只是发送了一个消息,
private static Message getPostMessage(Runnable r) {
Message m = Message.obtain();
m.callback = r;
return m;
}
handler.dispatch()的时候,会调用下面的方法
message.callback.run();
就是直接调用的Runnable的run方法,并不是strat(),所以仅仅是当做一个有run()的普通类使用而已,并不是开启了一个新的线程
private static Message getPostMessage(Runnable r) {
Message m = Message.obtain();
m.callback = r;
return m;
}
handler.dispatch()的时候,会调用下面的方法
message.callback.run();
就是直接调用的Runnable的run方法,并不是strat(),所以仅仅是当做一个有run()的普通类使用而已,并不是开启了一个新的线程
#14
就是直接调用的Runnable的run方法,并不是strat(),所以仅仅是当做一个有run()的普通类使用而已,并不是开启了一个新的线程,这个我明白,不明白的是他没有启动新的线程,UI线程不会造成阻塞吗。
#15
这位仁兄讲的是最清晰的 赞
#16
Handler类里面有这么一段源码:
handler在分发消息时,做了判断,看当前message的callback有没有值,如果有则执行给的回调,否则调用具体实现类的handleMessage方法。
那么handler.post(runnable)方法其实也是会创建一个message,让后把message的callback属性值设置为当前方法接收到的runnable参数,而不是开启新线程,不要顾名思义,一定要去看看源码,否则你会被网上很多浅显的分析所误导。
handler.post(runnable)与handler.sendMessage()系列方法区别在于:
用前者的形式时,handler不需要实现handleMessage方法,runnable的类体代替了。
用后者则handler必须实现handleMessage方法,不然怎么处理收到的消息?
/**
* Handle system messages here.
*/
public void dispatchMessage(Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
}
handler在分发消息时,做了判断,看当前message的callback有没有值,如果有则执行给的回调,否则调用具体实现类的handleMessage方法。
那么handler.post(runnable)方法其实也是会创建一个message,让后把message的callback属性值设置为当前方法接收到的runnable参数,而不是开启新线程,不要顾名思义,一定要去看看源码,否则你会被网上很多浅显的分析所误导。
handler.post(runnable)与handler.sendMessage()系列方法区别在于:
用前者的形式时,handler不需要实现handleMessage方法,runnable的类体代替了。
用后者则handler必须实现handleMessage方法,不然怎么处理收到的消息?
#1
handler.post(new Runnable()
{
@Override
public void run()
{
System.out.println(Looper.myLooper().getThread()+"post");
textView.setText("alreadly changed");
}
});
各位大神求指教啊,new 一个runnable不是开启一个新线程么,为什么在这就不适用了呢。通过打印可以得出还是运行在main线程里面,也能更新UI主键。为啥是这样呢,为啥呢??
我也不知道,帮你顶一下吧。。。
{
@Override
public void run()
{
System.out.println(Looper.myLooper().getThread()+"post");
textView.setText("alreadly changed");
}
});
各位大神求指教啊,new 一个runnable不是开启一个新线程么,为什么在这就不适用了呢。通过打印可以得出还是运行在main线程里面,也能更新UI主键。为啥是这样呢,为啥呢??
我也不知道,帮你顶一下吧。。。
#2
谁告诉你new Runnable()是开新线程的?
#3
java里面不都是这样,开线程要么是new一个thread要么是实现new Runnable接口。。。
#4
我也是新手,我的理解是handler.post是在线程需要用主线程执行代码段时使用,实现与主线程的同步,post下的代码在主线程中执行,不知道对不对
#5
找了下资料,原来handler.post还真不是开新线程message.callback.run();最后handler的调用是run方法不是start方法。
但是这样又有一个问题了,post的意义何在?既然不是新线程直接在主线程做这些操作就可以了啊,为啥还弄个post方法?
#6
我的理解是这个post就是和ui线程打交道的快速通道,因为很多时候handler都不是主线程里面,用post就能快速更新UI界面了。
#7
Handler是绑定到创建它的主线程中的,Handler跟UI主线程是同一个线程。Handler的作用:主要是在其他后台线程中,通过handler这个媒介,向UI主线程发送Runnable对象(即代码段)
#8
textView.setText("alreadly changed");
不能再异步线程里面更新ui界面
不能再异步线程里面更新ui界面
#9
handler.post应该是在主线程下执行的 ,不是另外新开线程 我觉得
#10
handler.post应该是在主线程下执行的
#11
你需要修改handler默认的looper.
#12
这个说的对,,,
#13
看下源码就很清楚了,view.post(Runnable)内部实际还是使用的handler.post(Runnable),而这个方法,内部会执行下面的方法,从而把Runnable设置为Message.callback,实际上相当于handler.sendMessage(),只是发送了一个消息,
private static Message getPostMessage(Runnable r) {
Message m = Message.obtain();
m.callback = r;
return m;
}
handler.dispatch()的时候,会调用下面的方法
message.callback.run();
就是直接调用的Runnable的run方法,并不是strat(),所以仅仅是当做一个有run()的普通类使用而已,并不是开启了一个新的线程
private static Message getPostMessage(Runnable r) {
Message m = Message.obtain();
m.callback = r;
return m;
}
handler.dispatch()的时候,会调用下面的方法
message.callback.run();
就是直接调用的Runnable的run方法,并不是strat(),所以仅仅是当做一个有run()的普通类使用而已,并不是开启了一个新的线程
#14
就是直接调用的Runnable的run方法,并不是strat(),所以仅仅是当做一个有run()的普通类使用而已,并不是开启了一个新的线程,这个我明白,不明白的是他没有启动新的线程,UI线程不会造成阻塞吗。
#15
这位仁兄讲的是最清晰的 赞
#16
Handler类里面有这么一段源码:
handler在分发消息时,做了判断,看当前message的callback有没有值,如果有则执行给的回调,否则调用具体实现类的handleMessage方法。
那么handler.post(runnable)方法其实也是会创建一个message,让后把message的callback属性值设置为当前方法接收到的runnable参数,而不是开启新线程,不要顾名思义,一定要去看看源码,否则你会被网上很多浅显的分析所误导。
handler.post(runnable)与handler.sendMessage()系列方法区别在于:
用前者的形式时,handler不需要实现handleMessage方法,runnable的类体代替了。
用后者则handler必须实现handleMessage方法,不然怎么处理收到的消息?
/**
* Handle system messages here.
*/
public void dispatchMessage(Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
}
handler在分发消息时,做了判断,看当前message的callback有没有值,如果有则执行给的回调,否则调用具体实现类的handleMessage方法。
那么handler.post(runnable)方法其实也是会创建一个message,让后把message的callback属性值设置为当前方法接收到的runnable参数,而不是开启新线程,不要顾名思义,一定要去看看源码,否则你会被网上很多浅显的分析所误导。
handler.post(runnable)与handler.sendMessage()系列方法区别在于:
用前者的形式时,handler不需要实现handleMessage方法,runnable的类体代替了。
用后者则handler必须实现handleMessage方法,不然怎么处理收到的消息?