将上下文,活动或视图保持为类的成员是不好的表现?

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()而不是和?

mak*_*tar 8

Activity实例传递给某个方法或在某处存储对它的引用是一种不好的做法,因为在配置更改期间,Android会创建一个活动的新实例,而旧的实例应该被垃圾收集器删除.但是,如果有人持有对旧Activity对象的引用,则GC不会收集它,直到引用它为止.因此发生内存泄漏.

但是在适配器构造函数的情况下,传递活动实例是完全可以的,因为适配器生命周期与活动生命周期相关联.通常在活动后会收集垃圾.

getApplicationContext 返回当前进程的单个全局Application对象的上下文,以便可以在整个应用程序代码中安全地使用它.


Qia*_*Jin 0

这与性能不佳无关,而是与可能的内存泄漏有关。通过 getApplicationContext() 而不是 Activity 只是为了避免潜在的内存泄漏。

活动将视图保留为成员并没有什么问题,因为视图的上下文就是活动。如果 Activity 不保存引用,则每次要访问视图时都需要调用 findViewById,这确实会影响性能。关于适配器,您仍然可以传递 Activity 而不是上下文。