繁体   English   中英

Android倒数计时器与游戏循环问题

[英]Android countdowntimer with game loop issue

我有一个倒数计时器,试图从SurfaceView线程(不是主线程)倒数,这给出了一个异常“无法在尚未调用Looper.prepare()的线程内创建处理程序”。 在查看其他答案时,他们说使用处理程序来解决问题(我无法真正使用runonUIthread,因为我无权访问任何活动)。

我的问题是,我究竟该如何使用处理程序才能使以下代码从工作线程按预期方式运行?

(在上下文中,我试图通过在倒数计时器的每个滴答处更改其Alpha值,从而将某些图形渲染到Surfaceview画布上,从而在辅助线程上执行此操作)

    new CountDownTimer(30000, 1000) {
        public void onTick(long millisUntilFinished) 
        {
            Log.e("TEST", ""+millisUntilFinished / 1000);
             message = ("seconds remaining: " + millisUntilFinished / 1000);
        }

        public void onFinish() 
        {
            message = "finished";
            }
    }.start();

您可以结合处理程序线程和工作线程。 在主线程中创建处理程序,并在辅助线程中使用处理程序引用进行UI更新。

    public final static int MSG_TICK = 0;
    public final static int MSG_DONE = 1;
    public final static String KEY_MSG = "message";

处理消息并更新UI

        final Handler handler = new Handler(handlerThread.getLooper()) {

            @Override
            public void handleMessage(Message msg) {
                // TODO Auto-generated method stub
                switch (msg.what) {
                case MSG_TICK:
                    Bundle bundle = msg.getData();
                    if (bundle != null) {
                        String content = bundle.getString(KEY_MSG);
                        // TODO: draw content
                    }
                    break;
                case MSG_DONE:
                    // TODO: draw content
                    break;
                }
            }

        };

从工作线程发送消息

        new Thread(new Runnable(){

            @Override
            public void run() {
                // TODO Auto-generated method stub
                int seconds = 30;
                String message = null;
                while (seconds != 0) {
                    message = "seconds remaining: " + seconds;
                    Message msg = new Message();
                    // what message
                    msg.what = MSG_TICK;
                    // set data
                    Bundle data = new Bundle();
                    data.putString(KEY_MSG, message);
                    msg.setData(data);

                    handler.sendMessage(msg);
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    --seconds;
                }

                message = "finished";
                handler.sendEmptyMessage(MSG_DONE);
            }

        }).start();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM