`
xiaominghimi
  • 浏览: 51881 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

【Android游戏开发十九】(必看篇)SurfaceView运行机制详解—剖析Back与Home按键及切入后台等异常处理!

 
阅读更多

Himi 原创, 欢迎转载,转载请在明显处注明! 谢谢。

原文地址:http://blog.csdn.net/xiaominghimi/archive/2011/01/18/6149816.aspx

在这里先向各位童鞋道个歉!我解释下:当我在给大家讲解的时候会附带上源码,可是这个源码是演示代码,为了让大家看的清楚,所以我会尽可能把一些与其无关的删掉,但是发现演示代码还是被一些童鞋们效仿,导致不少童鞋问我为什么程序执行后切入后台重新进入会报异常的问题!(这里我就全面讲解下运行机制,希望以后大家有类似问题自己就能解决了哈~)

切入后台操作比如点击HOME按键,点击返回按键...

那么重新进入程序报异常主要Surfaceiew有两点会报异常:

第一:提交画布异常!如下图(模拟器错误提示,以及Logcat Detail)

解决代码:

先看备注1这里,之前的文章中我给大家解释过为什么要把sfh.unlockCanvasAndPost(canvas); 写在finally中,主要是为了保证能正常的提交画

布.今天主要说说备注2这里一定要判定下canvas是否为空,因为当程序切入后台的时候,canvas是获取不到的!那么canvas一旦为空,提交画

布这里就会出现参数异常的错误!

下面来说另外一种情况:线程启动异常!如下图(模拟器错误提示,以及Logcat Detail)

这种异常只是在当你程序运行期间点击Home按钮后再次进入程序的时候报的异常,异常说咱们的线程已经启动!为什么返回按钮就没事?

OK,下面我们就要来先详细讲解一下Android中Back和Home按键的机制!然后分析问题,并且解决问题!

先看下面MySurfaceViewAnimation.java的类中的代码:

以上是我们常用的自定义SurfaceView,并且使用Runnable接口老框架了不多说了,其中我在本类的构造、创建、状态改变、消亡函数都加上打印!

OK,下面看第一张图:(刚运行程序)

上图的左边部分是Dubug!这里显示我们有一条线程在运行,名字叫"himi_Thread_one";


上图的左边部分是LogCat日志!大家很清晰的看到,当第一次进入程序的时候,会先进入view构造函数、然后是创建view、然后是view状态改变、OK,这个大家都知道!

下面我来点击Home(手机上的小房子)按键!这时程序处于后台!然后重新进入程序的过程!

上图可以看出我们的线程还是一条、这里主要观察从点击home到再次进入程序的过程:(过程如下):

点击home 调用了view销毁、然后进入程序会先进入view创建,最后是view状态改变!

上面的过程很容易理解,重要的角色上场了~Back 按钮!点我点击Back按钮看看发生了什么!

先看左边的Debug一栏,多了一条线程! 看LogCat发现比点击Home按键多调用了一次构造函数!

好了,从我们测试的程序来看,无疑,点击Home 和 点击 Back按钮再次进入程序的时候,步骤是不一样的,线程数量也变了!

那么这里就能解释为什么我们点击Back按钮不异常、点击Home会异常了!


原因:因为点击Back按钮再次进入程序的时候先进入的是view构造函数里,那么就是说这里又new了一个线程出来,并启动!那么而我们点击Home却不一样了,因为点击home之后再次进入程序不会进入构造函数,而是直接进入了view创建这个函数,而在view创建这个函数中我们有个启动线程的操作,其实第一次启动程序的线程还在运行,so~这里就一定异常了,说线程已经启动!

有些童鞋会问,我们为何不把th = new Thread(this, "himi_Thread_one");放在view创建函数中不就好了??!!

没错,可以!但是当你反复几次之后你发现你的程序中会多出很多条进程!(如下图)

虽然可以避免出现线程已经启动的异常,很明显这不是我们想要的结果!

那么下面给大家介绍最合适的解决方案:

修改MySurfaceViewAnimation.java

这里修改的地方有以下几点:

1. 我们都知道一个线程启动后,只要run方法执行结束,线程就销毁了,所以我增加了一个布尔值的成员变量 himi(备注1),这里可以控制我们的线程消亡的一个开关!(备注4

2.在启动线程之前,设置这个布尔值为ture,让线程一直运行.

3.在view销毁时,设置这个布尔值为false,销毁当前线程!(备注3

OK,这里图和解释够详细了,希望大家以后真正开发一款游戏的时候,一定要严谨代码,不要留有后患哈~

分享到:
评论

相关推荐

    SurfaceView运行机制详解

    SurfaceView是Android中用于自定义绘图的视图组件,它提供了...通过本文的分析,我们可以更好地理解和掌握SurfaceView的运行机制和异常处理方法,从而在实际开发中更有效地利用SurfaceView来实现复杂的图形和动画效果。

    Android SurfaceView运行机制剖析--处理切换到后台再重新进入程序时的异常

    本文将深入剖析SurfaceView的运行机制,并针对切换到后台再重新进入程序时可能出现的异常进行详细解释。 首先,我们来看第一个异常——提交画布异常。在Android中,SurfaceView通过SurfaceHolder来获取和提交Canvas...

    android之surfaceview游戏开发

    在Android平台上进行游戏开发,SurfaceView是一个至关重要的组件,它为高效、低延迟的图形绘制提供了可能,尤其适合用于创建动态、高性能的游戏画面。本文将深入探讨如何利用SurfaceView进行游戏开发,以及与之相关...

    android SurfaceView游戏框架

    在Android平台上开发游戏时,SurfaceView是一个至关重要的组件,它为高效、低延迟的图形渲染提供了可能。SurfaceView是Android系统提供的一种特殊视图,它有自己的独立绘制表面,与主线程分离,使得游戏或者视频这类...

    Android中SurfaceView截屏

    在Android开发中,`SurfaceView`是一个非常重要的视图组件,尤其在处理视频播放、游戏渲染等高性能图形操作时,它的优势在于拥有独立于主线程的渲染机制,能避免阻塞UI更新。然而,由于其特殊的性质,直接通过常规...

    Android游戏开发之旅

    9.Android游戏开发之旅九 VideoView类剖析 10.Android游戏开发之旅十 位图旋转 11.Android游戏开发之旅11 View中手势识别 12Android游戏开发之旅12 Sensor重力感应 13.Android游戏开发之旅13 Sensor感应示例 14...

    Android核心技术与实例详解—Android游戏开发实践—快乐数独(附完整源码)

    《Android核心技术与实例详解—Android游戏开发实践—快乐数独》是针对Android平台游戏开发的一份深入学习资源,其中包含了完整的源代码,旨在帮助开发者掌握Android游戏开发的关键技术和实践经验。这篇博文通过...

    Android游戏框架SurfaceView介绍

    ### Android游戏框架SurfaceView介绍 #### 一、SurfaceView与游戏开发 在Android平台上开发游戏时,SurfaceView是一个非常重要的组件。它提供了低延迟的显示功能,并且支持双缓冲机制,这对于实时渲染图像非常关键...

    【Android基础】(12)SurfaceView绘图API详解

    在Android开发中,SurfaceView是一种特殊的视图,它允许开发者在独立于主线程的单独线程中进行高性能的图形绘制,常用于视频播放、游戏等需要频繁更新图像的应用场景。本篇文章将深入探讨SurfaceView的绘图API及其...

    Android游戏开发学习(5)--实现Button悬浮于与SurfaceView之上

    在Android游戏开发中,将一个`Button`控件悬浮于`SurfaceView`之上是一项常见的需求。这通常是为了解决在游戏界面中添加交互元素,如暂停、设置或返回按钮,以便用户可以随时进行操作。本篇文章将深入探讨如何实现这...

    Android 构建游戏框架View与SurFaceView的区别

    在Android平台上构建游戏框架时,开发者常常会遇到两种主要的视图组件——View和SurfaceView。它们虽然都属于Android视图系统的一部分,但在处理高性能、低延迟的图形渲染时,两者有着显著的区别。 首先,我们要...

    Android SurfaceView 实现实时显示摄像头视频

    在Android开发中,实时显示摄像头视频是一个常见的需求,如创建相机应用、视频聊天或游戏等。`SurfaceView`是Android提供的一种用于高效显示多媒体数据的视图组件,尤其适合处理像视频流这样的实时数据。本篇文章将...

    android SurfaceView编写小游戏简单代码

    在Android平台上开发游戏时,`SurfaceView`是一个非常重要的组件,它是专为高性能绘图设计的,常用于创建动画或游戏。本篇文章将深入探讨如何使用`SurfaceView`来编写一款简单的小游戏。 首先,我们需要了解`...

    Android SurfaceView 实现图片缩放 滑动

    在Android开发中,SurfaceView是一种特殊的视图,它允许开发者创建高性能的图形界面,尤其适合处理视频播放或游戏等需要连续刷新的场景。本话题主要探讨如何利用SurfaceView实现图片的缩放和滑动功能。 首先,理解...

    安卓Android源码——(SurfaceView游戏框架).rar

    在安卓开发中,SurfaceView是一种特殊类型的视图,主要用于处理高性能、低延迟的图形渲染,如游戏或视频播放。SurfaceView允许开发者在一个单独的线程中进行绘制操作,避免阻塞UI主线程,从而提高应用的性能和用户...

    Android圆形相机预览窗口,圆形SurfaceView

    在Android开发中,有时我们可能需要创建一个独特的用户体验,比如设计一个圆形的相机预览窗口。这个场景就涉及到了Android的SurfaceView以及如何定制它的显示效果。本文将深入探讨如何实现一个圆形的相机预览窗口。 ...

    Android基于SurFaceView的小游戏

    总之,"Android基于SurfaceView的小游戏"是一个典型的Android游戏开发示例,它涵盖了Android图形编程、游戏逻辑设计、事件处理和资源管理等多个方面,对于Android开发者来说,学习和实践这样的项目有助于提升技能和...

    android surfaceview 悬浮窗圆角 windowmanager

    在Android开发中,`SurfaceView`是一个特殊类型的`View`,它允许开发者在应用程序中创建一个独立于应用程序主线程的渲染表面。`SurfaceView`通常用于处理高性能的图形或者视频播放,因为它可以在单独的线程中进行...

    Android SurfaceView 游戏 flabby bird 完整代码

    **Android SurfaceView 游戏开发:Flappy Bird 实例详解** 在Android开发中,SurfaceView是一种特殊的视图组件,常用于高性能的图形渲染,如游戏和视频播放。它提供了直接与硬件图形缓冲区交互的能力,使得开发者能...

    android MediaPlayer+SurfaceView实现播放

    在Android开发中,多媒体播放是常见的功能之一,`MediaPlayer` 和 `SurfaceView` 的结合使用是实现视频播放的标准方式。本篇文章将详细讲解如何利用这两个组件来构建一个视频播放器。 首先,`MediaPlayer` 是...

Global site tag (gtag.js) - Google Analytics