• Android线程计时器实现


    cocos2dx的计时器很好用,但当app进入后台,其计时器会pause掉,如果想要一个稳恒计时器就得自己去实现完成了,在Cocos2d-x for ios中我们可以利用NSTimer类并结合objc++来实现,非常好用。在Android平台我们就不得不用java类和jni来实现,计时器很多时候是用来刷新UI,所以还得考虑opengl线程调用问题

    下面我贴了一个用java线程来实现的类,这个是项目正在使用的部分代码。一个是秒计时器,用于倒计时使用;一种是毫秒计时器,取网络数据包时使用

    package com.iGamer;
    
    import org.cocos2dx.lib.Cocos2dxActivity;
    import org.cocos2dx.lib.Cocos2dxGLSurfaceView;
    
    public class TimerJavaToC 
    {
    
        public static String SECOND_TIMER_NAME = "SECOND_TIMER_NAME";
        public static String MILSECOND_TIMER_NAME = "MILSECOND_TIMER_NAME";
    
        private Cocos2dxGLSurfaceView mGLSurfaceView = null;
        
        private  Cocos2dxActivity mActivity;
        
        // 定义jni调用函数
        private static native void secondTickHandler();
         // 调用c++获取网络包
        private static native void milsecondTickHandler();
        
        private boolean _isSecondRunFlag = false;
        private boolean _isMilSecondRunFlag = false;
    
        public TimerJavaToC(Cocos2dxActivity act)
        {
            mActivity = act;
            mGLSurfaceView = Cocos2dxGLSurfaceView.getInstance();
            _isSecondRunFlag = true;
            _isMilSecondRunFlag = true;
            init();
        }
        private void init()
        {
             Thread secondThread = new Thread(new Runnable()
             {
                    public void run() 
                    {
                        try
                        {
                            if (!_isSecondRunFlag)
                            {
                                Thread.currentThread().interrupt(); //方法调用终止线程
                                return ; //跳出run方法
                            }
                            while (_isSecondRunFlag)
                            {
                                //暂停一秒
                                Thread.sleep(1000);
                                mGLSurfaceView.queueEvent( new Runnable()
                                {
                                    @Override
                                    public void run() 
                                    {
                                        //调用jni 
                                        TimerJavaToC.secondTickHandler();
                                    }
                                });
                            }
                        }
                        catch(Throwable t)
                        {
                            //jest end the thread
                        }
                    }
                    
             });
             secondThread.start();
             secondThread.setName(SECOND_TIMER_NAME);
             
             Thread milsecondThread = new Thread(new Runnable()
             {
                    public void run() 
                    {
                        try
                        {
                            if (!_isMilSecondRunFlag)
                            {
                                Thread.currentThread().interrupt(); //方法调用终止线程
                                return ; //跳出run方法
                            }
                            while (_isMilSecondRunFlag)
                            {
                                //暂停一毫秒
                                Thread.sleep(1);
                                mGLSurfaceView.queueEvent( new Runnable()
                                {
                                    @Override
                                    public void run() 
                                    {
                                        //调用jni     
                                        TimerJavaToC.milsecondTickHandler();
                                    }
                                });
                            }
                        }
                        catch(Throwable t)
                        {
                            //jest end the thread
                        }
                    }
                    
             });
             milsecondThread.start();
             milsecondThread.setName(MILSECOND_TIMER_NAME);
        }
        public void stopAllThread()
        {
            _isMilSecondRunFlag = false;
            _isSecondRunFlag = false;
        }
    }
  • 相关阅读:
    [CodeIgniter4]-将控制器放入子目录中
    [CodeIgniter4]-控制器
    [CodeIgniter4]-处理多环境
    [CodeIgniter4]-管理多个应用
    [CodeIgniter4]-代码模块
    [CodeIgniter4]-网页缓存
    [CodeIgniter4]-错误处理
    netfilter分析
    使用 SELinux 和 Smack 增强轻量级容器
    如何增强 Linux 系统的安全性,第一部分: Linux 安全模块(LSM)简介
  • 原文地址:https://www.cnblogs.com/howeho/p/3317361.html
Copyright © 2020-2023  润新知