Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android倒数计时器与游戏循环问题_Android_Multithreading_Countdowntimer - Fatal编程技术网

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

Android倒数计时器与游戏循环问题,android,multithreading,countdowntimer,Android,Multithreading,Countdowntimer,我有一个倒计时计时器试图从一个surfaceview线程(不是主线程)倒计时,它给出了一个异常“无法在未调用Looper.prepare()的线程内创建处理程序”。看看他们说的使用处理程序解决问题的其他答案(我不能真正使用runonUIthread,因为我没有访问任何活动的权限) 我的问题是如何确切地使用处理程序,以允许下面的代码从工作线程按预期运行 (在上下文中,我试图通过在倒计时的每一个滴答声中更改它们的alpha值,从而在工作线程下将一些图形渲染到surfaceview画布上) 您可以组合

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

我的问题是如何确切地使用处理程序,以允许下面的代码从工作线程按预期运行

(在上下文中,我试图通过在倒计时的每一个滴答声中更改它们的alpha值,从而在工作线程下将一些图形渲染到surfaceview画布上)


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

    public final static int MSG_TICK = 0;
    public final static int MSG_DONE = 1;
    public final static String KEY_MSG = "message";
处理消息和更新用户界面

        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 CountDownTimer(30000, 1000) {
        public void onTick(long millisUntilFinished) 
        {
            Log.e("TEST", ""+millisUntilFinished / 1000);
             message = ("seconds remaining: " + millisUntilFinished / 1000);
        }

        public void onFinish() 
        {
            message = "finished";
            }
    }.start();
        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();