Android-Fragment的使用

关于Fragment的使用,网上有很多关于它的文章。一般的使用过程和生命周期之类的,就不在这讲述了,下附的demo也会对这些方面有所展示。这里主要讲讲我在开发使用Fragment的过程中遇到的一些问题和使用时注意的要点。

首先要说的是,Fragment中有一个getActivity()的方法。这个方法会返回当前Fragment所附加的Activity。当fragment生命周期结束并销毁时,getActivity()返回的会是null。所以在使用时要注意判断null或者捕获空指针异常。但因为每次都要这样捕获一下,有些人可能就会和我一样,在创建fragment的时候就在构造器里面传一个activity的引用进去。这样的做法看似可以解决问题,但是其实是带着天大的隐患!因为activity传递得太多了,而且是传递给了另一个具有完整生命周期、可以长期运行且是在另一个页面进行执行的对象!这导致了activity的回收会很大地依赖众多的fragment,一旦业务比较多的时候,根本就看不来这么多地方,到底是哪里导致了activity的引用没有释放!这就导致了activity无法被回收。(虽然在我的项目里,我对这个问题进行了补救和处理,但也还是不大干净)。所以在这些情景,还是应该更多地关注android本身自带的生命周期管理函数。其实getActivity返回null的问题也只是让你要多判断一次而已,这没什么,从使用效益和合理性来说,这都不是一个问题。因为如果fragment已经销毁(onDestroy),这个页面也就没有使用意义,getActivity()之后的代码也就没有再继续执行的意义了(除非是一些异线程的处理,要注意线程也会跟着回收),所以只要判断getActivity()为空,就可以不再执行下面的代码,这完全不影响业务的使用。

但如果想要离开这个页面,但还保留这个页面,就要注意不要让它被回收了。只要不回收,一切都还在~~

另外,还有一个问题,就是一些没有被回收的线程在执行时,如果fragment已经销毁,那么它上面的那些控件,包括getActivity()都将是个空值,这时候就要在线程里面增加处理。

当然,正常来说,如果这个线程是在fragment里面申请的那些线程,没有被当前fragment以外的对象引用,当该fragment被销毁的时候,接着也会把这个线程销毁,就好像销毁它的控件一样。

/**
 * Copyright (c) 2010-2013 王子
 */
package cc.ives.fragment;

import android.app.Activity;
import android.app.Fragment;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

/**
 * @author Administrator
 *
 */
public class FragmentOne extends Fragment {
	private static final String TAG = "FragmentOne";
	private Context context;
	private TextView f1_txv;
	public FragmentOne(Context context){
		this.context = context;
	}
	

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View view = inflater.inflate(R.layout.fragmentone, null);
		f1_txv = (TextView) view.findViewById(R.id.txv_f1);
		Thread t1 = new Thread(new Runnable() {
			
			@Override
			public void run() {
				try {
					Thread.sleep(5000);	//阻塞5秒
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				((Activity)context).runOnUiThread(new Runnable() {
    //如果(Activity)context改成getActivity(),当fragment销毁时,将是空值
    //需要判断或捕获空指针异常解决问题。				
					@Override
					public void run() {
//						try{
						f1_txv.setText("f1 updated");	//2.如果线程销毁不够快,而fragment已经被销毁,则有可能抛异常

//						}catch(NullPointerException e){
//							Log.e(TAG, "捕获到异常");
//						}
					}
				});
			}		
		});
		t1.start();
		
		return view;
	}

	@Override
	public void onDestroy() {
		Log.e(TAG, "onDestroy");
		super.onDestroy();
	}


	@Override
	public void onPause() {
		Log.e(TAG, "onPause");
		super.onPause();
	}


	@Override
	public void onResume() {
		Log.e(TAG, "onResume");
		super.onResume();
	}


	@Override
	public void onStop() {
		Log.e(TAG, "onStop");
		super.onStop();
	}

	
}
详细代码在 http://download.csdn.net/detail/wzg_1987/5338545
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值