zoukankan      html  css  js  c++  java
  • 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;
        }
    }
  • 相关阅读:
    SSH2练习中问题之org.apache.jasper.JasperException: /findAllProductions_list.jsp(31,1) TLD又はタグファイル中のattribute指示子に従って属性itemsはどんな式も受け付けません解决方案
    关于HibernateTempleate模版很多代码可以直接使用,是开发人员不可多得选择
    Java实现权限控制之2
    struts 之 constant
    JSTL表达式之<c:forEach>
    关于事后检查和确认
    关于删除
    jcommander 解析boolean参数
    多线程
    关于proto文件的更新
  • 原文地址:https://www.cnblogs.com/howeho/p/3317361.html
Copyright © 2011-2022 走看看