Zba*_*ian 5 memory android memory-leaks reference
我在某个地方保持红色,将视图作为活动的成员保持不良性能,因为每个视图都保持对其父Context的引用,并且它将填满堆.这是真的?
想象一下这个活动:
public class MyActivity extends FragmentActivity{
private RelativeLayout mainLayout;
private LineraLayout menuLayout;
private FrameLayout tableLayout;
private Button buttonOk;
private Button buttonCancel;
@Override
protected void onCreate(Bundle bundle){
super.onCreate(bundle);
mainLayout = (RelativeLayout) findViewById(R.id.mainlayout);
// And inflating other views
}
}
Run Code Online (Sandbox Code Playgroud)
适配器怎么样?
public class MyAdapter extends BaseAdapter{
private MyActivity activity;
private ArrayList<MyObjects> myObjects;
public MyAdapter (MyActivity activity, ArrayList<MyObjects> myObjects){
this.activity = activity;
this.myObjects = myObjects;
}
}
Run Code Online (Sandbox Code Playgroud)
这是不好的表现吗?将活动作为参数而不是上下文传递是不是很糟糕?如果我想MyActivity
从适配器访问父类的公共方法怎么办?
非活动类
public MyDatabase{
private Context context;
private SQLiteDatabase db;
public MyDatabase(Context context){
this.context = context;
this.db = new DatabaseHelper(context).getWritableDatabase();
}
public Object getData(int id){
return db.query(params...);
}
public static class DatabseHelper extends SQLiteOpenHelper{
public DatabaseHelper(Context context){
super(context, "my_db", null, 1);
}
}
}
Run Code Online (Sandbox Code Playgroud)
为什么人们会说当一个类构造函数期望Context
一个参数时,你应该传递getApplicationContext()
而不是和?
将Activity
实例传递给某个方法或在某处存储对它的引用是一种不好的做法,因为在配置更改期间,Android会创建一个活动的新实例,而旧的实例应该被垃圾收集器删除.但是,如果有人持有对旧Activity
对象的引用,则GC不会收集它,直到引用它为止.因此发生内存泄漏.
但是在适配器构造函数的情况下,传递活动实例是完全可以的,因为适配器生命周期与活动生命周期相关联.通常在活动后会收集垃圾.
getApplicationContext
返回当前进程的单个全局Application对象的上下文,以便可以在整个应用程序代码中安全地使用它.
这与性能不佳无关,而是与可能的内存泄漏有关。通过 getApplicationContext() 而不是 Activity 只是为了避免潜在的内存泄漏。
活动将视图保留为成员并没有什么问题,因为视图的上下文就是活动。如果 Activity 不保存引用,则每次要访问视图时都需要调用 findViewById,这确实会影响性能。关于适配器,您仍然可以传递 Activity 而不是上下文。