安全地声明 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