Android开发——告诉你Adapter应该写在Activity里面还是外面
来源:互联网 发布:淘宝平板客户端和手机 编辑:程序博客网 时间:2024/09/21 11:23
0. 前言
本文转载自AItsuki的博客。
首先说明一下为什么要写这么一篇博客:最近看了一些其他人的项目,发现很多项目的做法是建立一个专门存放Adapter类的Package包,也有的项目干脆直接都写在Activity中。而我属于后者,我并不觉得Adapter需要单独占用一个包,因为大多数时候他们并不能给其他Activity复用。
其实这两种方式都是可以的,但有一点很关键,那就是无论如何,adapter不能持有activity的引用,否则可能会因为adapter里面可能会做一些耗时操作,当activity finish时会因为被adapter持有引用而导致activity无法被回收,从而导致内存泄漏。
1. 写在Activity外面也可能会导致内存泄漏
Java中,非静态内部类对象是会隐式持有外部类引用的,也就是说adapter持有了activity的引用。所以就有将Adapter写在单独的一个包中的做法,估计很多开发者都认为这样是为了让Activity看起来更简洁。
然而我还想说的是,adapter写在外面也阻止不了MDZZ程序员想在adapter内持有Activity引用。因为很多时候adapter不可避免的需要和Activity交互,或者需要一个context对象
比如说点击列表上的Item实现到跳转SecondActivity的效果,很多人可能这么做:
//外面的Adapter类public class ExampleAdapter extends BaseAdapter { private Context mContext; public ExampleAdapter(Context context) { this.mContext = context; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { //这里也用到了activity的引用 convertView = LayoutInflater.from(mContext).inflate(R.layout.list_item, null); } TextView textView = (TextView) convertView.findViewById(R.id.text); textView.setText(String.valueOf(position)); Button button = (Button) convertView.findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //使用构造方法传过来的上下文跳转界面 mContext.startActivity(new Intent(mContext, SecondActivity.class)); } }); return convertView;}
//MainActivity代码展示public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView listView = (ListView) findViewById(R.id.listView); //这里将activity对象传入adapter ExampleAdapter adapter = new ExampleAdapter(this); listView.setAdapter(adapter); }}
说实话,我第一次看上面代码,感觉很干净利落,甚至觉得有点舒服,=。=
但是这种情况下,adapter就持有了Activity引用,如果我们在adapter中进行耗时操作(比如加载图片之类的),并且finish Activity,虽然此时Activity销毁了,但是GC是无法回收activity的,而且Activity占用的内存还是比较大的,这样就发生了内存泄漏。
2. 不持有Activity对象的情况下怎么和Activity交互
那么在上面的例子中,问题就集中在了如何在不持有Activity对象的情况下和Activity交互。
2.1 首先处理getView()中的inflate()
当我们inflate一个xml时,完全可以使用parent的context,实现如下:
2.2 点击事件,可以用回调接口
使用回调接口的方式来实现不持有activity的情况下,与Activity愉快的交互,实现如下:
3. 其实写在里面也可以呀
adapter写在Activity里面的话只需要加个static关键字(变为静态内部类)就行了,其他和写在外面是一样的。
至此关于关于ListView的Adapter应该写在Activity外面还是里面的问题就讨论结束了,其实两种方式都可以,只要留意内存泄漏的风险即可。
- Android开发——告诉你Adapter应该写在Activity里面还是外面
- 告诉你ListView的Adapter应该写在Activity外面还是里面
- 告诉你ListView的Adapter应该写在Activity外面还是里面
- 告诉你ListView的Adapter应该写在Activity外面还是里面
- html <hn>应该在<a>的里面还是外面?
- 【Android】开发经验谈————很少有人会告诉你的Android开发基本常识
- jquery绑定函数写在$()函数里面与外面的区别
- 毕业了是应该考个研还是考个证儿?——写在MBA课程最后的日子里
- Android在Adapter里面调用Activity的方法/变量
- Android在Adapter里面调用Activity的方法/变量
- android 在adapter里面finish自己在的activity
- Android在Adapter里面调用Activity的方法/变量
- Android开发adapter与Activity交互
- using在namespace里面还是外面有区别吗
- Android在Adapter里面调用Activity或者fragment里面的的方法/变量代码
- 毕业了是应该考个研还是考个证儿?——写在MBA课程最后的日子里(2)
- 下面的代码告诉你返回的时候应该如何选择(返回的是数组还是对象)
- using写在命名空间外面和里面,有什么区别与讲究?
- 第五周项目一(7)1到100连加计算
- Linux workqueue工作原理
- oracle10G/11G官方下载地址集合 直接迅雷下载
- emmet使用简介
- Apache默认index页面
- Android开发——告诉你Adapter应该写在Activity里面还是外面
- 列表
- Mac 下两款 Markdown 编辑器 Mou/MacDown
- HDU 5904 - LCIS
- 今日头条面试经验分享
- 很不错的Map工具类
- Android 拦截 LinearLayout RelativeLayout ViewGroup 监听 传递到下面布局
- VR 触摸板模拟上下左右按键
- CodeForces 718A