1233568909222 2011-11-10 20:06
浏览 267
已采纳

关于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数据可以发送,为什么 接受不了呢? 求指教

  • 写回答

3条回答 默认 最新

  • 木兰殇 2011-11-15 17:59
    关注

    [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对象,全局变量

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序