mTextView和textView有什么区别吗?

来源:3-6 Activity 的 onActivityResult 使用起来非常麻烦,为什么不设计成回调?

慕田峪2868672

2019-09-24

听了好几遍了,说textView是自由变量。
还是不明白呀,他们不都是外部Activity对象的成员吗

写回答

1回答

bennyhuo

2019-09-24

这个点主要是不太好展示定义。

特意用变量名来区别,mTextView 这样的写法,m 表示 member,其实意思就是我们给外部的 Activity 定义了一个 field,这种情况对于 mTextView 的索引其实是相当于对于外部类引用 $this.mTextView,咱们替换 $this 就顺便把它的访问给解决掉了。

而 textView,表示是我们捕获了一个自由变量,这个自由变量可能大家不熟悉,意思就是它并不是外部类的成员,而是外部作用域内定义的一个 final 的变量。这种情况,我们就没有办法直接取替换了,因为在新的 Activity 创建以后,这个所谓的外部作用域其实是没有真正重新运行过的,所以这个变量根本就不会有,那么我们要怎么获得到它呢?考虑几个点:

  1. 如果它是一个值,例如整数,同时又是 final 的,那么这时候我们就不需要重新获取了,直接使用它的值就可以了。

  2. 如果它是一个引用,那么引用的对象如果跟 Activity的实例没有关系,同样,我们不需要去管他,因为逻辑上这个对象不会因为 Activity 的变更而受到什么影响。

  3. 如果它是一个引用,并且跟 Activity 有关系,那么除了是 Activity 成员的情况,大概率是引用了 UI,对于这种情况,我们可以根据 View 的 id 或者 Fragment 的 mWho 这个字段来获得新 Activity 当中对应的 View 或者 Fragment来解决

  4. 如果它是一个引用,并且跟 Activity 有关系,也可能指向 Activity 成员的成员,这种情况其实就比较复杂了,目前没有很好的解决办法,但这种情况其实很容易就可以规避掉。作为一个成熟的框架,可以在这里对回调捕获的变量做一个检查,如果发现捕获了 View 、Fragment 以外的引用类型,适当给出警告或者错误来提示开发者规避就好了,那么检查的方法也可以包括运行时和编译期,能采用的手段也是比较多的,又可以开始一个新的话题了。这其实也是就是最后思考题的答案。

1
1
慕田峪2868672
非常感谢!
2019-09-26
共1条回复

大厂资深面试官 带你破解Android高级面试

改变视野和思维 深度与广度兼备的 Android 进阶面试指导课程

1636 学习 · 222 问题

查看课程