概括Android系统存在的种种BUG


  本文标签:Android系统

  Android系统还是比较常用的,于是我研究了一下Android系统,在这里拿出来和大家分享一下,希望对大家有用  。经过长时间学习Android系统的原理,于是和大家分享一下,看完本文你肯定有不少收获,希望本文能教会你更多东西  。

  就界面Layout来说,这个程序其实和Snake没有什么不同,同样是采用了FrameLayout,而且游戏的主界面由一个自定义的View来实现,这里是LunarView  。读过上一篇文章的朋友也许会发现,Snake的架构是“定时器+系统调用onDraw”来实现的  。

  这里有一个最大的缺陷就是onDraw是由Android系统来调用的  。我们只能依赖它,却无法自行控制  。这就好比一个黑盒,当然,总是能把我们要的东西给做出来,可却无法控制其做事的细节  。

  这对于游戏这样高效率的东西可是不利的,因此最好的解决之道当然是把绘制这部分工作自己”承包“过来,告别吃大锅饭的,进入”联产承包制”时代  。此外,由于游戏的本质就是连续两帧图片之间发生些许差异,那么要不断催生这种差异的发生,只要有某种连续不断发生的事件在进行就可以  。

  例如Snake中使用的定时器,就是在不断地产生这种“差异源”,与此类似,一个线程也是不断在运行中,通过它也是可以不断产生这种“差异源”的  。如果说Snake中使用的Layout加自定义View是一把小型武器的话,那在SurfaceView对于android中游戏的开发来说就算是重型武器了  。

  我们使用前者时总是容易把游戏中某个对象(比如上文的每一个方格)当做一个小组件来处理,而后者则根本没有这种划分的概念,在它眼中,所有东西都是在Canvas(画布)中自行绘制出来的(背景,人物等)  。

  SurfaceView提供直接访问一个可画图的界面,可以控制在界面顶部的子视图层  。SurfaceView是提供给需要直接画像素而不是使用窗体部件的应用使用的  。Android图形系统中一个重要的概念和线索是surface  。View及其子类(如TextView, Button)

  要画在surface上  。每个surface创建一个Canvas对象(但属性时常改变),用来管理view在surface上的绘图操作,如画点画线  。还要注意的是,使用它的时候,一般都是出现在最顶层的:The view hierarchy will take care of correctly compositing   。

  with the Surface any siblings of the SurfaceView that would normally appear on top of it.使用的SurfaceView的时候,一般情况下还要对其进行创建,销毁,改变时的情况进行监视,这就要用到SurfaceHolder.Callback  。

  1.   public void surfaceChanged(SurfaceHolder holder, int format, int width,int height)  
  2.     {  
  3.         thread.setSurfaceSize(width, height);  
  4.     }  
  5. public void surfaceCreated(SurfaceHolder holder)  
  6. {//启动工作线程结束  
  7.         thread.setRunning(true);  
  8.         thread.start();  
  9.     }  
  10.     public void surfaceDestroyed(SurfaceHolder holder)  
  11.     {  
  12.         boolean retry = true;  
  13.         thread.setRunning(false);  
  14.         while (retry)   
  15.         {  
  16.             try  
  17.             {//等待工作线程结束,主线程才结束  
  18.                 thread.join();  
  19.                 retry = false;  
  20.             }   
  21.             catch (InterruptedException e)   
  22.             {  
  23.             }  
  24.         }  
  25.     } 

  这个线程由私有类Android系统实现,它里面还有一个自己的消息队列处理器,用来接收游戏状态消息,并在屏幕上显示当前状态  。(而这个功能在Snake中是通过View自己控制其包含的TextView是否显示来实现的,相比之下,LunarThread的消息处理机制更为高效)  。由于有了LunarThread这个负责具体工作的对象,所以LunarView的大部分工作都委托给后者去执行  。