大家好,正在学习Android,照抄了书上一个例子,一个线程每隔100毫秒发一个消息,主线程接收到消息后,把一个小球的位置移动一下,但是程序在模拟器上运行的时候,小球不动,debug的时候发现,主线程一直没有接收到消息。代码如下,请大家帮我看一下。谢谢!!!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.Looper;
import android.os.Message;
import android.util.AttributeSet;
import android.view.View;
import android.os.Handler;public class MainActivity extends Activity {

class MyView extends View implements Runnable {
private int x = 20, y = 20;
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
setFocusable(true);
new Thread(this).start();
}
@Override
public void run() {
Looper.prepare();
RefreshHandler mRedrawHandler = new RefreshHandler();

while (!Thread.currentThread().isInterrupted()) {
Message m = new Message();
m.what = 0x101;
mRedrawHandler.sendMessage(m);
try {
Thread.sleep(100);
} catch (InterruptedException e){
e.printStackTrace();
}
}
}
@Override
protected void onDraw(Canvas canvas) {
Paint p = new Paint();
p.setColor(Color.GREEN);
canvas.drawCircle(x, y, 10, p);
super.onDraw(canvas);
}

class RefreshHandler extends Handler {
@Override
public void handleMessage(Message msg) { // !!!从来没有执行到这里过
if (msg.what == 0x101) {
MyView.this.update();
MyView.this.invalidate();
}
super.handleMessage(msg);
}
};

private void update() {
int h = getHeight();
y += 5;
if (y >= h) {
y = 20;
}
}
}
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        setContentView(R.layout.main);
        MyView v = new MyView(this, null);
        setContentView(v);
    }
}

解决方案 »

  1.   

    debug时 ,确定消息发送了吗?
      

  2.   

    这一句代码mRedrawHandler.sendMessage(m);确实执行了!!!
    所以才很奇怪。
      

  3.   


    RefreshHandler mRedrawHandler = new RefreshHandler();
    放到oncreate里面应该就可以了
      

  4.   

    RefreshHandler mRedrawHandler = new RefreshHandler();把这个放到MainActivity 类下面试试,直接作为MainActivity 类的成员
      

  5.   

    去掉Looper.prepare();
    或者去掉Looper.prepare();
    RefreshHandler mRedrawHandler = new RefreshHandler(Looper.getMainLooper());试试