@Dao
interface UserDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertUser(user: User)
@Delete
fun deleteUser(user: User)
@Query(“select * from user where login =:name”)
fun getUserByName(name: String): LiveData
}
3. 定义DataBase类
@Database(entities = [User::class], version =7)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
companion object {
private var instance: AppDatabase? = null
@Synchronized
fun getDatabase(context: Context): AppDatabase {
instance?.let {
return it
}
return Room.databaseBuilder(
context.applicationContext,
AppDatabase::class.java,
“user_db”
).fallbackToDestructiveMigration().build().apply {
instance = this
}
}
}
}
4. 定义API接口
interface Api {
@GET(“users/{userName}”)
fun getUser(@Path(“userName”) userName: String): Call
}
5. 定义Retrofit访问网络
object RetrofitClient {
private const val BASE_URL = “https://api.github.com/”
var retrofit: Retrofit
init {
retrofit =
Retrofit.Builder().baseUrl(BASE_URL).addConverterFactory(GsonConverterFactory.create())
.build()
}
fun getApi(): Api? {
return retrofit.create(Api::class.java)
}
}
6. 定义Application类
class MyApplication : Application() {
companion object {
lateinit var context: Context
}
override fun onCreate() {
super.onCreate()
context = applicationContext
}
}
7. 定义Repository
object UserRepository {
var userDao: UserDao = AppDatabase.getDatabase(MyApplication.context).userDao()
fun getUser(name: String): LiveData {
refresh(name)
return userDao.getUserByName(name)
}
fun refresh(name: String) {
RetrofitClient.getApi()?.getUser(name)?.enqueue(object : Callback {
override fun onResponse(call: Call, response: Response) {
if (response.body() != null) {
insertUser(response.body()!!)
}
}
override fun onFailure(call: Call, t: Throwable) {
Log.d(“UserRepository”, “onFailure$t”)
}
})
}
fun insertUser(user: User) {
thread {
userDao.insertUser(user)
}
}
}
8. 定义ViewModel
class MvvmViewModel : ViewModel() {
val userName = “yaoxin521123”
fun getUser() = UserRepository.getUser(userName)
fun refresh() = UserRepository.refresh(userName)
}
9. 绘制xml
<?xml version="1.0" encoding="utf-8"?><variable
name=“user”
type=“com.yx.androidseniorpreparetest.eighth.bean.User” />
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout xmlns:android=“http://schemas.android.com/apk/res/android”
xmlns:tools=“http://schemas.android.com/tools”
android:id=“@+id/srl_SwipeRefreshLayout”
android:layout_width=“match_parent”
android:layout_height=“match_parent”
tools:context=“.eighth.MvvmActivity”>
<LinearLayout
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:orientation=“vertical”>
<de.hdodenhof.circleimageview.CircleImageView
android:layout_width=“95dp”
android:layout_height=“95dp”
android:layout_gravity=“center”
android:layout_marginTop=“20dp”
app:image=“@{user.avatar}” />
<TextView
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_gravity=“center”
android:layout_marginTop=“20dp”
android:text=“@{user.name}”
android:textColor=“#000000”
android:textSize=“20sp” />
<TextView
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_gravity=“center”
android:layout_marginTop=“20dp”
android:text=“@{user.login}”
android:textColor=“#000000”
android:textSize=“20sp” />
<TextView
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_gravity=“center”
android:layout_marginTop=“20dp”
android:text=“@{user.blog}”
android:textColor=“#000000”
android:textSize=“20sp” />
<TextView
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_gravity=“center”
android:layout_marginTop=“20dp”
android:text=“@{user.company}”
android:textColor=“#000000”
android:textSize=“20sp” />
<TextView
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_gravity=“center”
android:layout_marginTop=“20dp”
android:text=“@{user.bio}”
android:textColor=“#000000”
android:textSize=“20sp” />
<TextView
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_gravity=“center”
android:layout_marginTop=“20dp”
android:text=“@{user.location}”
android:textColor=“#000000”
android:textSize=“20sp” />
<TextView
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_gravity=“center”
android:layout_marginTop=“20dp”
android:text=“@{user.htmlUrl}”
android:textColor=“#000000”
android:textSize=“20sp” />
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout
10. 在Activity触发事件
class MvvmActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
最后
在这里小编整理了一份Android大厂常见面试题,和一些Android架构视频解析,都已整理成文档,全部都已打包好了,希望能够对大家有所帮助,在面试中能顺利通过。
喜欢本文的话,不妨顺手给我点个小赞、评论区留言或者转发支持一下呗
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
最后
在这里小编整理了一份Android大厂常见面试题,和一些Android架构视频解析,都已整理成文档,全部都已打包好了,希望能够对大家有所帮助,在面试中能顺利通过。
[外链图片转存中…(img-N5KR5V9J-1713434619674)]
[外链图片转存中…(img-K8cHfMZW-1713434619674)]
喜欢本文的话,不妨顺手给我点个小赞、评论区留言或者转发支持一下呗
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!