问题描述
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;}} }}这个 handler数据可以发送,为什么 接受不了呢? 求指教
解决方案
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--*/}这个改好了 在主线程中创建接收消息的handler,然后在方法里面更新RockView对象,全局变量
解决方案二:
楼主试试看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();
解决方案三:
因为你只写了一个发送消息的handler这个一直运行,但是没有接受消息的handler一直运行你让谁去接收你的消息。而且就算接受了你的消息,在调用invalidate()方法时也会报错,因为要刷新这个view必须在创建这个view的线程中