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条)

报告相同问题?

悬赏问题

  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能