ava.lang.RuntimeException:无法创建类 com.example.bookkeepers.BookViewModel 的实例
Posted
技术标签:
【中文标题】ava.lang.RuntimeException:无法创建类 com.example.bookkeepers.BookViewModel 的实例【英文标题】:ava.lang.RuntimeException: Cannot create an instance of class com.example.bookkeepers.BookViewModel 【发布时间】:2019-12-29 21:37:28 【问题描述】:我正在开发一个新书 android 应用程序,但是当我测试从 logcat 获取以下异常的代码时应用程序崩溃
java.lang.RuntimeException:无法启动活动 组件信息com.example.bookkeepers/com.example.bookkeepers.MainActivity: java.lang.RuntimeException:无法创建类的实例 com.example.bookkeepers.BookViewModel 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2843) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2921) 在 android.app.ActivityThread.-wrap11(未知来源:0) android.app.ActivityThread$H.handleMessage(ActivityThread.java:1639) 在 android.os.Handler.dispatchMessage(Handler.java:106) 在 android.os.Looper.loop(Looper.java:176) 在 android.app.ActivityThread.main(ActivityThread.java:6662) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873) 引起 作者:java.lang.RuntimeException:无法创建类的实例 com.example.bookkeepers.BookViewModel 在 androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:208) 在 androidx.l
ifecycle.ViewModelProvider.get(ViewModelProvider.java:135) 在 androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:103) 在 com.example.bookkeepers.MainActivity.onCreate(MainActivity.kt:30) 在 android.app.Activity.performCreate(Activity.java:7074) 在 android.app.Activity.performCreate(Activity.java:7065) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2796) ... 9 更多原因:java.lang.reflect.InvocationTargetException at java.lang.reflect.Constructor.newInstance0(Native Method) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:334) 在 androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:200) ... 16 更多原因:java.lang.RuntimeException:找不到 com.example.bookkeepers.BookRoomDatabase 的实现。 BookRoomDatabase_Impl 不存在于 androidx.room.Room.getGeneratedImplementation(Room.java:94) 在 androidx.room.RoomDatabase$Builder.build(RoomDatabase.java:952) 在 com.example.bookkeepers.BookRoomDatabase$Companion.getDatabase(BookRoomDatabase.kt:24) 在 com.example.bookkeepers.BookViewModel.(BookViewModel.kt:12) ... 19 更多
在扩展 AndroidViewModel 类的 BookViewModel 类下方
class BookViewModel(application: Application) : AndroidViewModel(application)
private val bookDao: BookDao
init
val bookDb = BookRoomDatabase.getDatabase(application)
bookDao = bookDb!!.bookDao()
fun insert(book: Book)
InsertAsyncTask(bookDao).execute(book)
companion object
private class InsertAsyncTask(private val bookDao: BookDao) :
AsyncTask<Book, Void, Void>()
override fun doInBackground(vararg books: Book): Void?
bookDao.insert(books[0])
return null
在 MainActivity.kt 下面 类
MainActivity : AppCompatActivity()
lateinit var bookViewModel: BookViewModel
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setSupportActionBar(toolbar)
fab.setOnClickListener view ->
val intent = Intent(this, NewBookActivity::class.java)
startActivityForResult(intent, NEW_NOTE_ACTIVITY_REQUEST_CODE)
bookViewModel = ViewModelProviders.of(this).get(BookViewModel::class.java)
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?)
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == NEW_NOTE_ACTIVITY_REQUEST_CODE && resultCode == Activity.RESULT_OK)
val id = UUID.randomUUID().toString()
val authorName = data!!.getStringExtra(NewBookActivity.NEW_AUTHOR)
val bookName = data!!.getStringExtra(NewBookActivity.NEW_BOOK)
val book = Book(id, authorName, bookName)
bookViewModel.insert(book)
Toast.makeText(
applicationContext,
R.string.saved,
Toast.LENGTH_LONG
).show()
else
Toast.makeText(
applicationContext,
R.string.not_saved,
Toast.LENGTH_LONG
).show()
companion object
private const val NEW_NOTE_ACTIVITY_REQUEST_CODE = 1
低于数据库类
@Database(entities = [Book::class], version = 1)
abstract class BookRoomDatabase :RoomDatabase()
abstract fun bookDao():BookDao
companion object
private var bookRoomInstance:BookRoomDatabase? = null
fun getDatabase(context: Context): BookRoomDatabase?
if (bookRoomInstance == null)
synchronized(BookRoomDatabase::class.java)
if(bookRoomInstance == null)
bookRoomInstance = Room.databaseBuilder<BookRoomDatabase>(context.applicationContext,
BookRoomDatabase::class.java, "book_database")
.build()
return bookRoomInstance
dao类以下
@Dao
interface BookDao
@Insert
fun insert(book: Book)
书下实体类
@Entity(tableName = "books")
class Book(@PrimaryKey val id: String,
@ColumnInfo(name = "author")
val author: String,
val book:String)
【问题讨论】:
我从未使用过 Room,但我注意到您正在尝试实例化一个 Abstract 类,我认为这是不可能的。您应该有一个实现抽象函数的BookRoomDatabase
的子类。我认为这就是您看到崩溃的原因,因为它无法创建抽象类的实例。
你能发布你的 Arch 组件的 Gradle 依赖吗?
@jsmyth886 abstract 关键字不是问题,而是 Room 数据库的要求。查看文档:developer.android.com/training/data-storage/room
【参考方案1】:
您使用 kotlin 并在您的应用程序 build.gradle
中使用 kapt 插件 apply plugin 'kotlin-kapt'
并使用 kapt
而不是 annotationProcessor
的想法是
implementation "android.arch.lifecycle:extensions:$lifecycle_version"
kapt "android.arch.lifecycle:compiler:$lifecycle_version"
implementation "android.arch.persistence.room:runtime:$room_version"
kapt "android.arch.persistence.room:compiler:$room_version"
查看这个答案https://***.com/a/50487165/4614550
【讨论】:
【参考方案2】:问题是您试图在没有提供所需参数application: Application
的情况下实例化 ViewModel。
我在这里发布了解决此问题的答案:https://***.com/a/65004171/13834895。
【讨论】:
以上是关于ava.lang.RuntimeException:无法创建类 com.example.bookkeepers.BookViewModel 的实例的主要内容,如果未能解决你的问题,请参考以下文章