Android DeBug日记(一) | 青训营笔记

664 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的的第5天

[CXX1300] CMake '3.18.1' was not found in SDK, PATH, or by cmake.dir propert

  1. SDKManager ==》SDK Tools 勾选 cmake

image.png

  1. 查看cmake version C:\Users\21941\AppData\Local\Android\Sdk\cmake

image.png

  1. 修改cmake version build.gradle

image.png

Failed to find Build Tools revision 30.0.3

选择 Android SDK Build-Tools 30.0.3

image.png

【闪退】 :在 Room.databaseBuilder 时闪退

build.gradle(app) 加入:(kotlinroom 版本要一致)

dependencies {
    def room_version = "2.4.3"

    implementation "androidx.room:room-runtime:$room_version"
    annotationProcessor "androidx.room:room-compiler:$room_version"

    // To use Kotlin annotation processing tool (kapt)
    kapt "androidx.room:room-compiler:$roomVersion"
    // To use Kotlin Symbol Processing (KSP)
    ksp "androidx.room:room-compiler:$roomVersion"
}

Could not find method kapt() for arguments [androidx.room:room-compiler:2.4.3] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.

build.gradle(app) 加入:

plugins {
    id 'org.jetbrains.kotlin.kapt'
}

【闪退】在操作Room时闪退

原因:Room不允许在主线程中操作数据库

解决:在Room.databaseBuilder时开启运行主线程

Room.databaseBuilder(
    context.applicationContext,
    ItemDatabase::class.java,
    "database"
).allowMainThreadQueries().build()

object abstract报错

原因:kotlinobject 不允许是抽象的

解决:在 abstract 类中使用 companion object 作为静态方法构造单例模式

//singleton
@Database(entities = [Item::class], version = 1, exportSchema = false)
abstract class ItemDatabase : RoomDatabase() {

    companion object {
        private lateinit var database: ItemDatabase

        @JvmStatic
        fun getDatabase(@NotNull context: Context): ItemDatabase {
            if (!this::database.isInitialized) {
                database = Room.databaseBuilder(
                    context.applicationContext,
                    ItemDatabase::class.java,
                    "database"
                ).build()
            }
            return database
        }
    }

    abstract fun getItemDao(): ItemDao
}

Caused by: java.lang.IllegalStateException: Room cannot verify the data integrity. Looks like you've changed schema but forgot to update the version number. You can simply fix this by increasing the version number.

原因:更新数据库后未更新数据版本

解决:手动调整数据库版本

注意:每次数据库(尤其是列属性)反生变化需要调整数据库版本

OkHttp:response.body?.string() 闪退,报错:E/AndroidRuntime: FATAL EXCEPTION: main

原因:response.body?.string() 存在IO操作,不能再主线程进行。

解决:

fun doMovieGet(callback: OkHttpCallback) {
    OkHttpUtils.rankClient.newCall(OkHttpUtils.getMovieRankRequest()).enqueue(object : Callback {
        override fun onFailure(call: Call, e: IOException) {
            Log.e(OkHttpUtils.TAG, "onFailure: $e")
            OkHttpUtils.handle.post {
                callback.isFail()
            }
        }

        override fun onResponse(call: Call, response: Response) {
            Log.d(OkHttpUtils.TAG, "onResponse: ${response.body}")
            // 回调前进行数据处理
            val json = response.body?.string()
            if (json != null) {
                OkHttpUtils.handle.post {
                    callback.isSuccess(json)
                }
            } else {
                OkHttpUtils.handle.post {
                    callback.isFail()
                }
            }
        }

    })
}

LiveData使用ArrayList报错

报错代码:E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1

原因:LiveData 默认在子线程下,而 ArrayList 线程不安全

解决:使用线程安全的 List

注意:在 ./#【闪退】在操作Room时闪退 中提到,数据库操作一般在子线程运行,使用 ArryList ,也会报错。

git:本地仓库和远程仓库之间冲突解决

解决方法

1、把远程仓库master分支下载到本地并存为tmp分支

git fetch origin master:tmp 2、查看tmp分支与本地原有分支的不同

git diff tmp 这里主要是看看有没有其他的改动…

3、将tmp分支和本地的master分支合并

git merge tmp 这个时候呢,本地与远程就没有冲突了,而且还保留了我今天的代码,现在Push就OK啦!

4、最后别忘记删除tmp分支

git branch -d tmp

原文链接:blog.csdn.net/weixin_3937…

git:fetch和git pull的区别

见原文:blog.csdn.net/weixin_4234…