最后
我一直以来都有整理练习大厂面试题的习惯,有随时跳出舒服圈的准备,也许求职者已经很满意现在的工作,薪酬,觉得习惯而且安逸。
不过如果公司突然倒闭,或者部门被裁减,还能找到这样或者更好的工作吗?
我建议各位,多刷刷面试题,知道最新的技术,每三个月可以去面试一两家公司,因为你已经有不错的工作了,所以可以带着轻松的心态去面试,同时也可以增加面试的经验。
我可以将最近整理的一线互联网公司面试真题+解析分享给大家,大概花了三个月的时间整理2246页,帮助大家学习进步。
由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!以下是部分内容截图:
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
…
fun login(username: String, password: String, listener: OnLoginFinishedListener) {
// Mock login. I’m creating a handler to delay the answer a couple of seconds
postDelayed(2000) {
when {
username.isEmpty() -> listener.onUsernameError()
password.isEmpty() -> listener.onPasswordError()
else -> listener.onSuccess()
}
}
}
}
这是一个简单的方法,它接收用户名和密码,并进行一些验证操作。
View 层
View 层通常是由一个 Activity(也可以是一个 Fragment,一个 View,这取决于 App 的结构),它包含了一个对 Presenter 的引用。理想情况下,Presenter 是通过依赖注入的方式提供的(比如 Dagger),但如果你没有使用这类工具,也可以直接创建一个 Presenter 对象。View 需要做的唯一一件事就是:当有用户操作发生时(比如一个按钮被点击了),就调用 Presenter 中的相应方法。
由于 View 必须与 Presenter 层无关,因此它就需要实现一个接口。下面是示例中使用到的接口:
interface LoginView {
fun showProgress()
fun hideProgress()
fun setUsernameError()
fun setPasswordError()
fun navigateToHome()
}
接口中有一些有效的方法来显示或隐藏进度条,显示错误信息,跳转到下一个页面等等。正如上面所提到的,有很多方式去实现这些功能,但我更喜欢罗列出最简单直观的方法。
然后,Activity 可以实现这些方法。这里我向你展示了一些用法,以便你对其用法有所了解:
class LoginActivity : AppCompatActivity(), LoginView {
…
override fun showProgress() {
progress.visibility = View.VISIBLE
}
override fun hideProgress() {
progress.visibility = View.GONE
}
override fun setUsernameError() {
username.error = getString(R.string.username_error)
}
}
但是如果你还记得,我还告诉过你,View 层使用 Presenter 来通知用户交互操作。下面就是它的用法:
class LoginActivity : AppCompatActivity(), LoginView {
private val presenter = LoginPresenter(this, LoginInteractor())
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login)
button.setOnClickListener { validateCredentials() }
}
private fun validateCredentials() {
presenter.validateCredentials(username.text.toString(), password.text.toString())
}
override fun onDestroy() {
presenter.onDestroy()
super.onDestroy()
}
…
}
Presenter 被定义为 Activity 的属性,当点击按钮时,它会调用 validateCredentials()
方法,该方法将会通知 Presenter。
onDestroy()
方法亦是如此。我们稍后将会看到为什么在这种情况下需要通知 Presenter。
Presenter 层
Presenter 充当着 View 层和 Model 层的中间人。它从 Model 层获取收据并将格式化后数据返回给 View 层。
此外,与典型的 MVC 模式不同的是,Presenter 决定了当你在与 View 层交互时会做何响应。因此,它将为用户每个可执行的操作提供一种方法。我们在 View 层中看到了它,这里是代码实现:
class LoginPresenter(var loginView: LoginView?, val loginInteractor: LoginInteractor) :
LoginInteractor.OnLoginFinishedListener {
fun validateCredentials(username: String, password: String) {
loginView?.showProgress()
loginInteractor.login(username, password, this)
}
…
}
MVP 模式存在一些风险,常常被我们忽略的最重要的问题是 Presenter 永远依附在 View 上面。并且 View 层一般为 Activity,这就意味着:
- 我们可能会由于长时间的运行的任务而导致 Activity 的泄漏
- 我们可能会在 Activity 已经被销毁的情况下去更新视图
首先,倘若你能够保证能够在合理的时间内完成你的后台任务,我将不会过于担心。将你的 Activity 泄漏 5-10 秒会让你的 App 变得很糟糕,并且解决方案通常很复杂。
第二点反而更让人担心。想象一下,你花费 10 秒钟时间向服务器发送一个请求,但用户却在 5 秒钟后关闭了 Activity。当回调方法正在被调用并且 UI 被更新时,App 将会崩溃,因为 Activity 正在销毁中。
为了解决这个问题,我们可以在 Activity 中调用 onDestroy()
方法并清除 View:
最后
针对Android程序员,我这边给大家整理了一些资料,包括不限于高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!
往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、混合式开发(ReactNative+Weex)全方面的Android进阶实践技术,群内还有技术大牛一起讨论交流解决问题。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
友,可以戳这里获取](https://bbs.csdn.net/topics/618156601)**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!