当前位置:编程学习 > wap >>

菜鸟新人求解释handler.post

以下程序实现了显示一个图片:
请教 run()中的handler.post(new Runnable()这个是在线程中启动了一个新的线程,然后这个线程
在不停地运行invalidate();
1 handler.post究竟是什么概念?
2 为什么要这样做?我试了写一个invalidate();是不可以的。

public class MovingPictureView extends View implements Runnable{
 
 //用于显示的图片
 Bitmap bitmap;
 
 //图片坐标转化的线程是否运行,false,则停止运行
 boolean isRuning = true;
 
 //图片的Left,Top值
 int left = 0;
 int top = 0;
 
 //用于同步线程
 Handler handler;
 
 //向量,可以通过调节此两个变量调节移动速度
 int dx = 1;
 int dy = 1;
 
 public MovingPictureView(Context context) {
  super(context);
  setFocusable( true );
  bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test);
  handler = new Handler();
  new Thread(this).start();
 }
 
 @Override
 protected void onDraw(Canvas canvas) {
  //将图画到画板上
  canvas.drawBitmap(bitmap, left,top, null);
 }
 
 
 @Override
 public void run() {
  while(isRuning){
      handler.post(new Runnable() {
    @Override
    public void run() {
     invalidate();
    }
   });
   
   try {
    Thread.sleep(100);
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
  }
 }
--------------------编程问答-------------------- public final boolean post (Runnable r) 
Since: API Level 1 
Causes the Runnable r to be added to the message queue. The runnable will be run on the thread to which this handler is attached. 

Parameters
r  The Runnable that will be executed. 

Returns
Returns true if the Runnable was successfully placed in to the message queue. Returns false on failure, usually because the looper processing the message queue is exiting.
各位大侠,小可对线程的概念还不是很明了,可能就是因为这个理解不了handler。以上是handler.post的解释,是把当前的线程r加入到执行队列中,是吗?那么在这个while循环中新开一个线程究竟又是什么意思呢?为什么还要套一个while循环?为什么要新开一个线程?望高人指点! --------------------编程问答-------------------- --------------------编程问答-------------------- 首先, 线程中, 是不能控制UI的, 这再任何操作系统, 都应该会出现问题, 要用消息控制,在线程中加消息发送, 在handlemessage中, 截获你的消息, 来更新UI, 这点先明白了, 再继续做。 --------------------编程问答-------------------- post就是开个新的线程执行你想要做的事啊,就和javaee中的异步传输差不多吧ajax --------------------编程问答-------------------- 线程start之后就进入run,while中循环post,每次post都去invalidate
thread在start时就是启动一个新的子线程,为什么用post,这个不好说,因为大可只用handler的sendmessage来实现更新的。handler已经和UI线程(也就是主线程)绑定了,就可以直接进行UI的更新。 --------------------编程问答-------------------- 就是给自己上了一个定时器, 每隔一段时间刷新一次view。 
handler.post(Runnable) 中的Runnable 会在handler 所在的线程执行, 也就是View 所在的UI线程, 所以调用 Invalidate()方法是很合适的。
如果用5楼说的, sendmessage 实现应该也是可以的。 --------------------编程问答--------------------
线程间异步通信
--------------------编程问答-------------------- 学习了,我也在看handler,理解不了 --------------------编程问答-------------------- handler并没有新开一个线程啊   只是把runnable放进去而已    这样就可以跟handler都在主线程中    然后就可以更新ui了    while是保证隔一定时间就放一个runnable进入 --------------------编程问答-------------------- 3楼威武,正解 --------------------编程问答-------------------- 那么在这个while循环中新开一个线程究竟又是什么意思呢?

这个说的不对,while循环里没开线程。
Runnable本身不是线程。 --------------------编程问答--------------------
引用 11 楼 coxfilur_2008 的回复:
那么在这个while循环中新开一个线程究竟又是什么意思呢?

这个说的不对,while循环里没开线程。
Runnable本身不是线程。


1、UI是最线程,其它线程是无法和UI主线程交互的,handler.post(Runnable r)是为了让Runnable 具有这一功能,可以看到在run()方法中调用了invalidate()方法
2、问什么要一直while,大家都知道不管是游戏还是电影什么的其实都是由很多张图片不同的切换才具备了动画的效果,invalidate()就是为了做这么件事,当每次调用invalidate()时,系统会去回调onDraw()方法,也就是一帧了。 --------------------编程问答-------------------- --------------------编程问答-------------------- new Handler()默认的Looper是主线程的, //每个Looper里面都有一个消息队列,
h = new Handler(Looper l)//l为主线程的Looper。此时h为l所附属的handler,h的消息由post放在l的线程的队列中,由l所在的线程处理消息。
嗯,应该是这样的。 --------------------编程问答--------------------
引用 3 楼 starssn 的回复:
首先, 线程中, 是不能控制UI的, 这再任何操作系统, 都应该会出现问题, 要用消息控制,在线程中加消息发送, 在handlemessage中, 截获你的消息, 来更新UI, 这点先明白了, 再继续做。

异步线程可以更新UI啊
补充:移动开发 ,  Android
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,