`
zcwfeng
  • 浏览: 106591 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
社区版块
存档分类
最新评论

Android中Activity频繁进入再退出时程序崩溃的解决方案

 
阅读更多
最近在对一款开发中的游戏进行压力测试时会出现崩溃的问题,具体场景是 在进入一个Activity时立即按返回键退出该Activity再迅速进入该Activity,进入退出的时间间隔越短越容易发生崩溃,后来打印日志发现,由于Activity进入需要加载资源,退出需要释放资源,这两个操作都需要一定的时间,照以上场景进行压力测试就会出现 Activity在资源还没加载完之前然后程序就会去释放资源,这样就会出现空指针而崩溃;另一种情况是程序加载资源比较多,这样耗费的时间会比较久,同样释放资源也会比较久,在立即退出Activity再迅速进入该Activity的时候就会出现Activity的资源还没来得及释放,然后就再次加载了一遍资源,这样就会出现内存溢出异常。

解决问题一定要从根源出发,这样才能确保问题被彻底解决。上述问题的根源就是 由于用户操作太快导致资源在未被加载完之前又开始释放,以及资源会被重复加载两次。从问题根源出发,我们只要保证资源在加载完成之前确保资源不会被释放,以及资源不会被重复加载,这样问题就可以迎刃而解了。

解决方案有两种:一是加Loading页面,强制用户等待,这种方式在很多比较大型的游戏里很常见。二,是设置标志位在Activity资源加载完成之前禁止用户退出Activity, 这个适用于一些资源不太多,没有Loading页面的的情况,本质上也是强制用户等待(一些小的游戏常常没有loading页面 ,资源加载也加载也比较快,所以常常忽略了压力测试)

第一种方案,相信做游戏的朋友们都很熟悉,这里就不细讲了。

第二中方案,这里给出个一个框架,如下:

public class Test1 extends Activity

{

public static final int MSG_INIT_COMPLETE = 1;

public static final int MSG_DELAYED = 200;

private boolean isResume;



@Override

protected void onCreate(Bundle savedInstanceState)

{



// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

initRes();

isResume = false;

mHandler.sendEmptyMessageDelayed(MSG_INIT_COMPLETE, MSG_DELAYED);



}



public Handler mHandler = new Handler()

{



@Override

public void handleMessage(Message msg)

{



// TODO Auto-generated method stub

super.handleMessage(msg);

switch (msg.what)

{



case MSG_INIT_COMPLETE:

isResume = true;

break;



}

}

};

protected void onDestroy()

{



// TODO Auto-generated method stub

super.onDestroy();

recycleRes();

}



@Override

public boolean onKeyDown(int keyCode, KeyEvent event)

{



// TODO Auto-generated method stub

if (keyCode == KeyEvent.KEYCODE_BACK)

{

if (isResume)

{

startActivity(new Intent(this,Test2.class));

finish();

}

else

return false;

}

return super.onKeyDown(keyCode, event);

}

}

以上代码框架是防止Test1的资源被加载完成之前开始释放资源,即在资源加载完成之前屏蔽返回键事件。为了保险起见,在不影响用户体验的前提下大家可以把MSG_DELAYED的值再设置的大些。

public class Test extends Activity implements OnClickListener

{



public static final int MSG_INIT_COMPLETE = 1;

public static final int MSG_DELAYED = 200;

private boolean isResume;



@Override

protected void onCreate(Bundle savedInstanceState)

{



// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

isResume = false;

mHandler.sendEmptyMessageDelayed(MSG_INIT_COMPLETE, MSG_DELAYED);



}



public Handler mHandler = new Handler()

{



@Override

public void handleMessage(Message msg)

{



// TODO Auto-generated method stub

super.handleMessage(msg);

switch (msg.what)

{



case MSG_INIT_COMPLETE:

isResume = true;

break;



}

}

};



@Override

public void onClick(View v)

{



// TODO Auto-generated method stub

case TAG_GOTO_TEST1:

if(isResume)

{

startActivity(this,test1.class);

finish();

}

break;



}

}

这段代码是防止Test1的资源在释放完之前再次进入Test1造成内存溢出,同样,在不影响用户体验的前提下进入Test1的延迟时间可以再长久一些。

-------------------------------------------------------------------------------------

本文出自http://labs.easymobi.cn/?p=4386

分享到:
评论

相关推荐

    Android应用开发多个activity完全退出程序方法

    在Android中,Activity的启动和管理是通过Activity栈(也称为任务栈)来实现的。每次启动一个新Activity,它都会被压入栈顶,而当用户按返回键时,栈顶的Activity会被弹出。然而,仅依赖返回键并不能保证所有...

    Android 完全退出程序,关闭所有Activity

    首先,我们需要理解Android中的Activity生命周期。Activity是Android应用的基本构建块,它代表用户界面的一个屏幕。每个Activity都有自己的生命周期,包括创建、启动、暂停、恢复和销毁等状态。当用户按下后退键或...

    Android-Android实现了可以滑动左侧边缘退出Activity的功能

    本文将深入探讨如何在Android中实现这一功能,主要涉及Android自定义手势识别、视图层级管理和Activity的生命周期管理等核心知识点。 首先,我们需要理解Android中的手势识别。在Android中,我们可以使用`...

    android activity右进右出动画

    在Android中实现这种动画主要涉及两部分:进入动画(enter animation)和退出动画(exit animation)。下面我们将详细探讨如何实现这一功能。 1. **理解Activity动画** Android提供了`overridePendingTransition()...

    Android-AndroidActivity侧滑退出库

    标题 "Android-AndroidActivity侧滑退出库" 指的是在Android应用开发中,使用特定的库实现Activity的侧滑退出功能。这种功能常见于许多现代Android应用,它为用户提供了一种直观且易于操作的界面返回方式,类似于...

    Android 应用程序多Activity跳转之后退出整个程序

    本文将探讨如何在Android中实现多Activity跳转后的整体退出。 首先,我们来理解Activity的生命周期。每个Activity都有创建(onCreate())、启动(onStart())、恢复(onResume())、暂停(onPause())、停止...

    Activity启动和退出动画

    在Android开发中,Activity是应用程序的基本构建块,它代表用户与应用交互的界面。当我们谈论Activity的启动和退出动画,我们实际上是在讨论如何通过自定义动画来增强用户体验,使应用更具吸引力。Android系统允许...

    Android 多个activity完全退出实例代码

    1、新建一个 ExitApplication 类继承Application 2、在你要退出的activity Oncreate方法中加入...3、在你当前要完全退出程序的activity中覆盖onKeyDown方法. 4、当你点击手机的返回按钮时将提示:是否退出系统。

    退出程序提示,退出程序后关闭所有activity

    在Android应用开发中,"退出程序提示,退出程序后关闭所有Activity"是一个常见的需求,它涉及到用户交互和应用生命周期管理。Activity是Android系统中的一个核心组件,代表了用户与应用进行交互的界面。当用户完成某...

    Android使用Activity用作弹出式对话框

    总结起来,Android中使用`Activity`作为弹出式对话框主要涉及以下几个步骤: 1. 创建一个具有对话框样式的`Activity`。 2. 设计对话框的界面布局。 3. 设置窗口属性以达到对话框效果,如背景淡化和动画。 4. 使用...

    Android中Activity切换动画

    以下是对Android中Activity切换动画的详细说明: 1. **标准动画** Android系统默认提供了几种基本的切换动画,如淡入淡出、滑动等。这些动画可以通过在Manifest.xml文件中的`<activity>`标签内设置`android:...

    怎样完全退出android程序

    在Android中,如果想退出Android程序,一般都是调用finish()、System.exit(0)android.os.Process.killProcess(android.os.Process.myPid())等方法来实现退出程序功能,可是在实际开发中,并不能达到完全退出应用程序...

    Activity最小化终极解决方案

    下面将详细介绍一种被称为“Activity最小化终极解决方案”的方法,该方法涉及到了Android的权限设置、Activity生命周期以及Logcat的使用。 首先,我们需要了解Android对Home键的处理机制。默认情况下,系统不允许...

    android 退出app 退出应用程序

    退出app的两种方式 1 创建activity的基类,...这样就可以清除栈底之外的所有activity,程序会自动执行onNewIntent方法,在该方法中获取它action, 如果等于"exit_app",则关闭栈底activity,就可以退出App 详情请看代码

    Android中实现再按一次返回键退出应用程序

    总结来说,"Android中实现再按一次返回键退出应用程序"的核心是通过重写Activity的onKeyDown()方法,监听返回键事件,并结合时间判断来决定是否真的退出应用。这种设计体现了Android应用开发中的用户体验和交互设计...

    android退出所有Activity并且不弹出对话框实现

    在Android中,每个应用程序都有一个任务(Task)栈,Activity按照启动顺序被压入栈中,最后启动的Activity位于栈顶。当用户按下Back键时,系统会从栈顶取出并销毁当前Activity,依次回退到前一个Activity。而要退出...

    android中的Activity启动方式

    一旦改模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中。 其中standard是系统默认的启动...

    android中activity跳转的几种动画

    本篇文章将深入探讨如何在Android中实现Activity跳转的几种动画效果。 一、默认动画 在不设置任何自定义动画的情况下,Android系统会使用默认的滑动效果进行Activity切换。这种效果可以通过设置`activity过渡`来...

    android 如何完全退出程序

    在Android中,单纯调用`System.exit(0)`或`android.os.Process.killProcess(android.os.Process.myPid())`并不能确保应用程序中的所有Activity都被完全关闭,尤其是当应用程序中有多个Activity栈存在时。这种情况下...

    安卓安装卸载相关-Android中应用程序Activity管理类用于Activity管理和应用程序退出。.zip

    本资源包主要关注Android中的Activity管理和应用程序的退出操作。 首先,ActivityCollector是一个可能包含在压缩包中的类,它的作用可能是收集并管理多个Activity实例。在Android开发中,我们有时需要跟踪或控制...

Global site tag (gtag.js) - Google Analytics