Rusmus 2011-01-26 15:08
浏览 195
已采纳

请教关于Android中Looper的一个问题

在循环中handler.sendMessage(msg)后,利用Looper.loop()来调用handler.handleMessage(msg),如何让loop()退出执行下个迭代?
[code="java"]
public class MainActivity extends Activity{

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    MyView view = new MyView(this, null);
    setContentView(view);
}

// 自定义视图类
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();
        Handler refreshHandler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                if(msg.what==0x101111){
                    MyView.this.update();
                    MyView.this.invalidate();
                }
            }
        };

        while(!Thread.currentThread().isInterrupted()){
            // 通过发送消息更新界面
            Message msg = refreshHandler.obtainMessage();
            msg.what = 0x101111;
            refreshHandler.sendMessage(msg);
            Looper.loop();
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 实例化画笔
        Paint paint = new Paint();
        // 设置画笔颜色
        paint.setColor(Color.GREEN);
        // 画圆
        canvas.drawCircle(x, y, 10, paint);
    }


    // 更新坐标
    private void update(){
        int h = 500;
        y += 5;
        if(y>=h)
            y = 20;
    }

}

}
[/code]

  • 写回答

4条回答 默认 最新

  • dongya1987 2011-01-27 10:23
    关注

    完全正确,因为你只send了一次message,handler当然只执行一次handleMessage。

    你的第一个问题补充说的很正确。另外这个例子写的很蹊跷。在handler的同一个线程中执行执行它的sendMessage,还有什么用呢,跟直接的函数调用又有什么却别呢?完全失去了用Handler的意义。Handler和Looper这个模型就是为了处理其他线程间的消息传递,在同一个线程内就失去意义了。

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

报告相同问题?

悬赏问题

  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置