关于handler 信息接收 问题。。。。。

[code="java"]

package com.rock;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.AttributeSet;
import android.view.View;

public class RockActivity extends Activity {
/*

  • 动态图形的绘制基本思路是,创建一个类继承View(或surfaceView)覆盖
  • onDraw()方法,使用 Canvas对象在界面上绘制不同的图形,使用invalidate()
  • 方法刷新界面 。下面是一个弹球实例 运用动态图形绘制基本思路。
    */

    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    RockView rockView=new RockView(this, null);
    setContentView(rockView);
    

    }

    class RockView extends View implements Runnable{

    private int x=20,y=20;
    
    protected void onDraw(Canvas canvas) {
    
        //实例化画笔
        Paint paint=new Paint();
        //设置画笔颜色
        paint.setColor(Color.GREEN);
    
        canvas.drawCircle(x, y, 10, paint);
        super.onDraw(canvas);
    }
    
    public RockView(Context context, AttributeSet attrs) {
    
        super(context, attrs);
        //获得焦点
        setFocusable(true);
        new Thread(this).start();
    }
    
    /*
     *E/AndroidRuntime( 4582): java.lang.RuntimeException:
     * Can't create handler inside thread that has not called Looper.prepare()
     * 
     * 解决方法之一 在 run()方法 前 加Looper.prepare() 末尾 加Looper.loop();
     */
    public void run() {
        Looper.prepare();
        RefreshHandler refreshHandler=new RefreshHandler();
    
        while(!(Thread.currentThread().isInterrupted())){
    
            Message msg=new Message();
            msg.what=0x101;
            refreshHandler.sendMessage(msg);
    
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        Looper.loop();
    }
    
    class RefreshHandler extends Handler{
    
        public void handleMessage(Message msg) {        
    
            if(msg.what==0x101){
                 RockView.this.update();
                 RockView.this.invalidate();
            }
                super.handleMessage(msg);
            }
    
    }
    private void update(){
        int height=getHeight();
        y+=5;
        if(y>=height){
            y=20;
        }
    }
    

    }
    }

[/code]

这个 handler数据可以发送,为什么 接受不了呢? 求指教

[code="java"]
public class RockActivity extends Activity {

/*

  • 动态图形的绘制基本思路是,创建一个类继承View(或surfaceView)覆盖
  • onDraw()方法,使用 Canvas对象在界面上绘制不同的图形,使用invalidate()
  • 方法刷新界面 。下面是一个弹球实例 运用动态图形绘制基本思路。
    */

    private RefreshHandler refreshHandler = null;
    private RockView rockView = null;
    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    refreshHandler = new RefreshHandler() ;
    rockView=new RockView(this, null);

    setContentView(rockView);

    }

    class RockView extends View implements Runnable{

     private int x=20,y=20;  
    
     protected void onDraw(Canvas canvas) {  
    
         //实例化画笔  
         Paint paint=new Paint();  
         //设置画笔颜色  
         paint.setColor(Color.GREEN);  
    
         canvas.drawCircle(x, y, 10, paint);  
         super.onDraw(canvas);  
     }  
    
     public RockView(Context context, AttributeSet attrs) {  
    
         super(context, attrs);  
         //获得焦点  
         setFocusable(true);  
         new Thread(this).start();  
     }  
    
     /* 
      *E/AndroidRuntime( 4582): java.lang.RuntimeException: 
      * Can't create handler inside thread that has not called Looper.prepare() 
      *  
      * 解决方法之一 在 run()方法 前 加Looper.prepare() 末尾 加Looper.loop(); 
      */  
     public void run() {  
         Looper.prepare();  
        // RefreshHandler refreshHandler=new RefreshHandler();  
         while(!(Thread.currentThread().isInterrupted())){  
             Message msg=new Message();  
             msg.what=0x101;  
             refreshHandler.sendMessage(msg); 
             try {  
                 Thread.sleep(500);  
             } catch (InterruptedException e) {  
                 e.printStackTrace();  
             }  
         }  
         Looper.loop();  
     }  
    
     private void update(){  
         int height=getHeight();  
         y+=5;  
         if(y>=height){  
             y=20;  
         }  
     }  
    

    }

    /*--class refreshHandler--*/
    class RefreshHandler extends Handler{

     public void handleMessage(Message msg) {          
    
         if(msg.what==0x101){  
             rockView.update();  
             rockView.invalidate();  
         }  
             super.handleMessage(msg);  
         }  
    

    }

    /*--class refreshHandler--*/
    }
    [/code]
    这个改好了 在主线程中创建接收消息的handler,然后在方法里面更新RockView对象,全局变量

因为你只写了一个发送消息的handler这个一直运行,但是没有接受消息的handler一直运行你让谁去接收你的消息。而且就算接受了你的消息,在调用invalidate()方法时也会报错,因为要刷新这个view必须在创建这个view的线程中

楼主试试看RockView.this.invalidate();
换成RockView.this.postinvalidate();
还有你这个handler是在class RockView 这个类里面的吧,handler不是应该用来给UI主线程发送消息的吗,主类是class RockActivity
我自己写的刷新VIEW的方式
private Handler handler = new Handler();
private Runnable runnable = new Runnable() {
public void run() {
im.postInvalidate();
handler.postDelayed(this, 1000);// 这个是不断刷新,间隔1秒
}
};

new Thread(runnable).start();