安全地声明 RecyclerView 对象:作为 activity 的字段还是作为 onCreate() 方法的局部变量?
Safely declaring a RecyclerView object: as a field of the activity or as a local variable of the onCreate() method?
初始代码:
public class SummaryActivity extends AppCompatActivity
{
private RecyclerView recyclerView;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_summary);
recyclerView = findViewById(R.id.summary_recycler);
...
Android Studio (v3.3) 建议将 recyclerView
本地化到 onCreate()
方法。
修改后的代码:
public class SummaryActivity extends AppCompatActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_summary);
RecyclerView recyclerView = findViewById(R.id.summary_recycler);
...
运行 两个版本多次,并没有发现任何差异。这个比那个好吗?如果是,你能解释一下为什么吗?我有一个暗示,将 recyclerView
声明为 class field/member 更安全,但缺乏足够的理解。
我想知道在 onCreate()
方法完成执行后,第二个版本中的 recyclerView
会发生什么。稍后垃圾收集会突然破坏对象吗?
到目前为止,我发现的与此主题最接近的是:
,但遗憾的是它没有触及我面临的具体问题。
我确信这件事不仅仅适用于 RecyclerView
个对象,理解将帮助我在未来更恰当地编写代码,在其他情况下也是如此。
非常感谢您提供的任何说明。提前致谢!
I wonder what happens to recyclerView in the second version after the onCreate() method has finished executing. Would garbage collection later on suddenly destroy the object?
由于我们在这里讨论的对象是 View
,它是 Activity
的 "content View" 的一部分,只有 Activity
才会被销毁作为一个整体将被摧毁。
"normal" 字段有所不同:RecyclerView
将在后台实例化,因为您调用 setContentView(R.layout.activity_summary);
,因此运行时将扩充布局文件。
在您的代码中,您没有实例化它,而是通过"finding"它将它分配给一个变量:
RecyclerView recyclerView = findViewById(R.id.summary_recycler);
如果将变量保留在本地,可能会提高代码的可读性。但是,只有在不需要以多种方法访问 RecyclerView
时才应该这样做,因为每次调用 findViewById()
时,都会搜索整个 View
树,直到找到具有匹配 ID 的 View
。
初始代码:
public class SummaryActivity extends AppCompatActivity
{
private RecyclerView recyclerView;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_summary);
recyclerView = findViewById(R.id.summary_recycler);
...
Android Studio (v3.3) 建议将 recyclerView
本地化到 onCreate()
方法。
修改后的代码:
public class SummaryActivity extends AppCompatActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_summary);
RecyclerView recyclerView = findViewById(R.id.summary_recycler);
...
运行 两个版本多次,并没有发现任何差异。这个比那个好吗?如果是,你能解释一下为什么吗?我有一个暗示,将 recyclerView
声明为 class field/member 更安全,但缺乏足够的理解。
我想知道在 onCreate()
方法完成执行后,第二个版本中的 recyclerView
会发生什么。稍后垃圾收集会突然破坏对象吗?
到目前为止,我发现的与此主题最接近的是:
我确信这件事不仅仅适用于 RecyclerView
个对象,理解将帮助我在未来更恰当地编写代码,在其他情况下也是如此。
非常感谢您提供的任何说明。提前致谢!
I wonder what happens to recyclerView in the second version after the onCreate() method has finished executing. Would garbage collection later on suddenly destroy the object?
由于我们在这里讨论的对象是 View
,它是 Activity
的 "content View" 的一部分,只有 Activity
才会被销毁作为一个整体将被摧毁。
"normal" 字段有所不同:RecyclerView
将在后台实例化,因为您调用 setContentView(R.layout.activity_summary);
,因此运行时将扩充布局文件。
在您的代码中,您没有实例化它,而是通过"finding"它将它分配给一个变量:
RecyclerView recyclerView = findViewById(R.id.summary_recycler);
如果将变量保留在本地,可能会提高代码的可读性。但是,只有在不需要以多种方法访问 RecyclerView
时才应该这样做,因为每次调用 findViewById()
时,都会搜索整个 View
树,直到找到具有匹配 ID 的 View
。