观察LiveData时应使用Lambda还是匿名类?
Lambda vs 匿名类实现LiveData Observer的显著差异
最近在使用LiveData做状态监听的时候,我发现用Lambda表达式和传统匿名类来实现Observer接口,存在很明显的差异。下面是两种实现方式的代码示例:
匿名类实现
button.setOnClickListener(e -> { mainViewModel.getCounter().observe(MainFragment.this, new Observer<Integer>() { @Override public void onChanged(@Nullable Integer counter) { android.util.Log.i("CHEOK", "Observer 3 : " + counter + ", " + this); } }); });
这里要注意,匿名类内部的this指向的是当前匿名Observer实例本身,所以日志里会输出这个Observer对象的具体引用。
Lambda表达式实现
button.setOnClickListener(e -> { mainViewModel.getCounter().observe(MainFragment.this, counter -> { android.util.Log.i("CHEOK", "Observer 3 : " + counter + ", " + this); }); });
而Lambda表达式里的this则指向外部类(此处为MainFragment)的实例,这是两者最直观的差异点。除此之外,在底层实现上也有区别:匿名类会生成独立的class文件,而Lambda依赖invokedynamic指令实现,不会产生额外的class文件,在内存引用、序列化场景下的表现也有所不同。
内容的提问来源于stack exchange,提问作者Cheok Yan Cheng
相关产品推荐
相关产品推荐

