[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 {
/*
方法刷新界面 。下面是一个弹球实例 运用动态图形绘制基本思路。
*/
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 {
/*
方法刷新界面 。下面是一个弹球实例 运用动态图形绘制基本思路。
*/
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();