`
布衣Sao年
  • 浏览: 7973 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

android fragment因系统内存不足等原因导致被kill后的异常

 
阅读更多

android4.0以后好像很强调使用fragment了,连ADT最新版本生成的默认工程中都运用了fragment,使用了才知道确实是好用很多,相当于将一个界面分成了很多个独立的部分,每个部分可以独立的实现自己的逻辑,且相互可以数据交互,很方便操作。当然,刚刚接触会嫌得很麻烦,慢慢用起来就好了。

今天fragment使用过程中出现了个问题,具体描述下:

首先,一般使用fragment都要在activity中onCreate方法里new一个fragment,然后添加到fragment管理器中并显示出来,如下:

<span style="font-size:18px;">// 主帖界面
Fragment fragment = new Fragment();
// 添加显示第一个fragment
transaction.add(R.id.fragment_container, fragment).show(fragment).commit();</span>

那么,问题来了,我们new了一个fragment以后,fragment进入了自己的生命周期。当用户将当前activity切换到后台(是moveTaskToBack不是finish),这时候容器activity和fragment都进入onStop状态(调用了该方法,关于activity和fragment的生命周期自行脑补),而当手机内存不足神马的原因(挫手机)将咱的应用kill掉了,这时候重新打开应用,activity和fragment都保留下来,并重新执行onCreate->onStart->onResume方法,重点重点!!!activity又执行了一次new Fragment(),又一次将新fragment加入到了布局管理器,这时候应用将运行两个fragment!于是一切都不好了。。。同样的操作重复一次,应用又多了一个fragment,以此类推,子子孙孙无穷尽也~当然在两个fragment运行的时候程序已经不正常执行了。

很高兴能发现这个问题,看网上很多都是这样去初始化fragment的,坑了我好久,今天搞了一个多小时终于发现了这个问题,然后无脑补fragment生命周期,然后发现了activity中的:

@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

请注意,这个方法是带参数的,它带这东西是干嘛的?从来没用过啊!于是又观察了activity的生命周期,发现在activity的生命周期中,只要离开了可见阶段,或者说失去了焦点,activity就很可能被进程终止了!被KILL掉了,这时候,就需要有种机制,能保存当时的状态,这就是savedInstanceState的作用。

当一个Activity在PAUSE时,被kill之前,它可以调用onSaveInstanceState()来保存当前activity的状态信息(在paused状态时,要被KILLED的时候)。用来保存状态信息的Bundle会同时传给两个method,即onRestoreInstanceState() and onCreate()。

那么我找到一种解决方法:

if(savedInstanceState == null){
	fragment = new <span style="font-size:18px;">Fragment</span>();
	transaction.add(R.id.fragment_container, mainFragment, "mainFragment");
}else{
	fragment = manager.findFragmentByTag("mainFragment");
}
transaction.show(fragment).commit();

如上代码,先判断savedInstanceState是否为空,为空证明新来的,没有历史,那就new一个,但是在添加到transaction中时注意加一个tag,当savedInstanceState不为空时证明他是有历史的,不是被kill了就是被非正常kill了,于是为了避免出现多余的fragment,我从管理器中通过tag找到之前fragment,然后在显示出来,这样程序中还是一个activity和一个fragment在运行着,程序也就正常了。

小问题还是在不断测试中需求答案,网上给的可以参考到问题也很多,大家还有好的fragment的使用经验,谢谢分享。




分享到:
评论

相关推荐

    Android Fragment切换动画

    在Android应用开发中,Fragment是UI组件的一种,它允许我们构建可重用的模块化界面。Fragment可以在Activity中动态添加、删除或替换,这在设计适应不同屏幕尺寸和配置的应用时非常有用。当我们想要增强用户体验,使...

    Android Activity内嵌Fragment,当Activity recreate时Fragment被添加多次,造成界面重叠

    然而,在使用Fragment时,有时会出现一个问题:当Activity由于配置更改(如屏幕旋转)等原因需要重建(recreate)时,内嵌的Fragment可能会被不正确地添加多次,导致界面重叠。这个问题通常与如何管理和恢复Fragment...

    Android fragment切换动画.rar

    在Android应用开发中,Fragment是UI组件的一种,用于在大屏幕设备上实现多屏或复合视图。Fragment可以在Activity之间动态地添加、移除或替换,使得应用在不同屏幕尺寸和配置下都能提供良好的用户体验。"Android ...

    Android中Fragment管理及重叠问题的解决方法

    在Android应用开发中,Fragment是UI组件的重要组成部分,它允许我们构建可动态组合的应用界面,尤其是在平板电脑等大屏幕设备上。本文将深入探讨Fragment的管理以及如何解决Fragment重叠问题。 首先,Fragment是在...

    Android Fragment

    Android Fragment是Android应用程序开发中的一个核心组件,它在Android 3.0(API级别11)版本被引入,主要用于创建动态且模块化的用户界面。Fragment的设计理念是为了更好地适应多屏幕设备,使得开发者能够将UI的...

    android fragment 保存状态

    当我们谈论“android fragment 保存状态”,核心问题通常集中在如何在Fragment的状态发生变化时(例如屏幕旋转或系统内存回收)保留其数据和UI状态。 Fragment的生命周期中,有两个关键点与状态保存密切相关:`...

    Android Fragment实例

    在Android应用开发中,Fragment是Android SDK中的一个重要组件,它被设计用来支持多屏幕适配和增强用户界面的模块化。Fragment允许开发者将应用程序的功能或UI部分分解为独立的、可重用的组件,这些组件可以在不同的...

    Android Fragment超详细教程

    一、Android Fragment 的基础知识介绍 1.1 概述 1.2 范例 二、Android Fragment 示例讲解一 2.1 创建 Fragment 2.2 Fragment 管理 2.3 Fragment 与 Activity 通讯 2.4 Fragment 示例 三、Android ...

    Android fragment 内部嵌套tabhost组件

    在Android应用开发中,Fragment是Android 3.0(API级别11)引入的一个关键组件,它使得在大屏幕设备上实现多面板布局变得更加容易。TabHost则是一种经典的UI组件,用于实现Tab式界面,让用户可以方便地在多个视图间...

    android fragment demo 源码,切换

    6. **Fragment的保存状态**:当Activity因配置改变(如设备旋转)而销毁并重建时,Fragment的状态通常会被自动保存。但是,开发者仍需要在onSaveInstanceState(Bundle)中保存临时数据,以防意外情况导致数据丢失。 ...

    Android下Fragment的动画切换效果

    在Android开发中,Fragment是应用程序界面的一个模块化组件,它可以在Activity中添加、删除或替换。Fragment提供了在不同屏幕尺寸和配置变化下管理用户界面的能力。本教程将深入探讨如何在Android应用程序中实现...

    android fragment超简单使用demo

    在Android应用开发中,Fragment是Android SDK提供的一种组件,它允许开发者在Activity中划分不同的UI区域,实现更灵活的界面布局和用户交互。本示例"android fragment超简单使用demo"专注于Fragment的基础使用,旨在...

    Android在Fragment中实现监听触摸事件

    "Android在Fragment中实现监听触摸事件" Android在Fragment中实现监听触摸事件是指在Android应用程序中,如何在Fragment中监听触摸事件。Fragment是Android应用程序中的一个组件,它可以在Activity中使用,但是它并...

    Android解决多个Fragment切换时布局重新实例化问题,并保存当前fragment页面,系统回收后还原之前fragment页面,更新版

    然而,当涉及到多个Fragment之间的切换时,可能会遇到一个问题:每次切换时,Fragment的布局可能会被重新实例化,导致用户体验下降,例如丢失用户在Fragment中的状态。为了解决这个问题,我们需要采取一系列策略来...

    android Fragment界面框架简单实用

    简单实用的Fragment框架,适用于商城,影音,即时通讯等项目!经测试可用!下载直接运行,如有问题请联系扣扣2691608900!!!

    Android使用Fragment实现标签页

    Fragment的概念是从Android3.0开始引入的,直译为碎片、片段,目的是为不同屏幕大小的设备(手机、平板等)创建灵活动态的UI。诚如其名,你可以把Fragment当作是Activity的模块化组件,它拥有自己的生命周期和UI,接受...

    android Fragment Demo

    在Android应用开发中,Fragment是Android SDK中的一个重要组件,它被设计用来支持动态和模块化的用户界面。Fragment可以看作是Activity的一部分,可以在Activity中添加、移除或替换,允许开发者构建适应不同屏幕尺寸...

    android组件Fragment介绍

    * onCreate():在实现代码中,应当初始化想要在 Fragment 中保持的必要组件,当 Fragment 被暂停或者停止后可以恢复 * onCreateView():为了绘制 Fragment 的 UI,必须返回一个 View,这个 View 是 Fragment 布局的...

    Android fragment demo

    1. **内存泄漏**:Fragment的生命周期与Activity关联,不正确地管理Fragment可能导致Activity内存泄漏,确保在不再使用时调用FragmentManager的remove()或detach()方法。 2. **Fragment的保存状态**:当Activity重建...

Global site tag (gtag.js) - Google Analytics