我如何修复这个错误的视图模型?(在模拟器上运行程序时发生)



在模拟器上运行程序出错:

2022-06-16 15:38:04.724 12519-12555/com.example。mvvm E/AwareLog:atomicfileutil: readFileLines文件不存在android.util.AtomicFile@5abc1232022-06-16 15:38:04.725 12519-12555/com.example。mvvm E/AwareLog:atomicfileutil: readFileLines文件不存在android.util.AtomicFile@30c16202022-06-16 15:38:05.103 12519-12519/com.example。mvvm E/AndroidRuntime:

FATAL EXCEPTION: main
Process: com.example.mvvm, PID: 12519
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mvvm/com.example.mvvm.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class com.example.mvvm.UserViewModel
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3782)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3961)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:91)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2386)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:213)
at android.app.ActivityThread.main(ActivityThread.java:8178)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101)
Caused by: java.lang.RuntimeException: Cannot create an instance of class com.example.mvvm.UserViewModel
at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.kt:201)
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:319)
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:301)
at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.kt:175)
at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.kt:138)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:184)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:153)
at com.example.mvvm.MainActivity.onCreate(MainActivity.kt:15)
at android.app.Activity.performCreate(Activity.java:8086)
at android.app.Activity.performCreate(Activity.java:8074)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1313)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3755)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3961) 
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:91) 
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149) 
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2386) 
at android.os.Handler.dispatchMessage(Handler.java:107) 
at android.os.Looper.loop(Looper.java:213) 
at android.app.ActivityThread.main(ActivityThread.java:8178) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101) 
Caused by: java.lang.InstantiationException: java.lang.Class<com.example.mvvm.UserViewModel> has no zero argument constructor
at java.lang.Class.newInstance(Native Method)
at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.kt:199)
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:319) 
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:301) 
at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.kt:175) 
at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.kt:138) 
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:184) 
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:153) 
at com.example.mvvm.MainActivity.onCreate(MainActivity.kt:15) 
at android.app.Activity.performCreate(Activity.java:8086) 
at android.app.Activity.performCreate(Activity.java:8074) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1313) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3755) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3961) 
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:91) 
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149) 
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2386) 
at android.os.Handler.dispatchMessage(Handler.java:107) 
at android.os.Looper.loop(Looper.java:213) 
at android.app.ActivityThread.main(ActivityThread.java:8178) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101) 
2022-06-16 15:41:00.974 12826-12826/? E/om.example.mvv: Unknown bits 
set in runtime_flags: 0x8000
2022-06-16 15:41:00.998 12826-12826/? E/libc: Access denied finding 
property "runtime.mmitest.isrunning"
2022-06-16 15:41:01.342 12826-12897/com.example.mvvm E/AwareLog: 
AtomicFileUtils: readFileLines file not exist: 
android.util.AtomicFile@5abc123
2022-06-16 15:41:01.343 12826-12897/com.example.mvvm E/AwareLog: 
AtomicFileUtils: readFileLines file not exist: 
android.util.AtomicFile@30c1620
2022-06-16 15:41:01.768 12826-12826/com.example.mvvm 
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.mvvm, PID: 12826
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mvvm/com.example.mvvm.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class com.example.mvvm.UserViewModel
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3782)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3961)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:91)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2386)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:213)
at android.app.ActivityThread.main(ActivityThread.java:8178)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101)
Caused by: java.lang.RuntimeException: Cannot create an instance of class com.example.mvvm.UserViewModel
at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.kt:201)
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:319)
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:301)
at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.kt:175)
at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.kt:138)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:184)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:153)
at com.example.mvvm.MainActivity.onCreate(MainActivity.kt:15)
at android.app.Activity.performCreate(Activity.java:8086)
at android.app.Activity.performCreate(Activity.java:8074)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1313)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3755)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3961) 
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:91) 
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149) 
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2386) 
at android.os.Handler.dispatchMessage(Handler.java:107) 
at android.os.Looper.loop(Looper.java:213) 
at android.app.ActivityThread.main(ActivityThread.java:8178) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101) 
Caused by: java.lang.InstantiationException: java.lang.Class<com.example.mvvm.UserViewModel> has no zero argument constructor
at java.lang.Class.newInstance(Native Method)
at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.kt:199)

MainActivity:

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.ViewModelProvider
import com.example.mvvm.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
lateinit var binding : ActivityMainBinding
lateinit var userviewModel: UserViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this ,R.layout.activity_main)
userviewModel= ViewModelProvider(this).get(UserViewModel :: class.java)
val dao = UserDatabase.getInstance(application).userDao
val repository = UserRepository(dao)
val factory = UserViewModelFactory(repository)
userviewModel = ViewModelProvider(this ,factory).get(UserViewModel::class.java)
binding.myViewModel=userviewModel
binding.lifecycleOwner=this
}

}

userViewModel:

import androidx.databinding.Bindable
import androidx.databinding.Observable
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.launch
class UserViewModel(val repository : UserRepository): ViewModel(), Observable {
val users = repository.users
@Bindable
var inputName = MutableLiveData<String>()!!
@Bindable
var inputEmail = MutableLiveData<String>()!!
@Bindable
var saveupdateButtonText = MutableLiveData<String>()
@Bindable
var deleteAlldeleteButtonText = MutableLiveData<String>()
init {
saveupdateButtonText.value = "دخیره"
deleteAlldeleteButtonText.value = "حذف"
}
fun saveOrUpdate() {
val name: String = inputName.value!!
val email: String = inputEmail.value!!
insert(User(0, name, email))
inputName.value = null
inputEmail.value = null
}
fun deleteAllOrDelete() {
deleteAll()
}
fun insert(user: User) {
viewModelScope.launch {
repository.insert(user)
}
}
fun deleteAll() {
viewModelScope.launch {
repository.deleteAll()
}
}
override fun addOnPropertyChangedCallback(callback: Observable.OnPropertyChangedCallback?) {
}
override fun removeOnPropertyChangedCallback(callback: Observable.OnPropertyChangedCallback?) {
}

}

UserViewModelFactory:

import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
class UserViewModelFactory(val repository: UserRepository) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(UserViewModel::class.java)){
return UserViewModel(repository) as  T
}
throw IllegalAccessException("Unknown ViewModel Class")
}

}

UserRepository:

class UserRepository(val dao:UserDao) {
val users = dao.getAllUsers()
suspend fun insert (user:User){
dao.insertUser(user)
}
suspend fun update (user:User){
dao.updateUser(user)
}
suspend fun delete (user:User){
dao.deleteUser(user)
}

suspend fun deleteAll (){
dao.deleteAll()
}

}

用户:

import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName ="user_table") 
data class User (
@PrimaryKey(autoGenerate = true) 
@ColumnInfo(name ="user_id") 
val id :Int ,
@ColumnInfo(name="user_name")
val name :String,
@ColumnInfo(name="user_email")
val email : String
)

用户道:

import androidx.lifecycle.LiveData
import androidx.room.*
@Dao
interface UserDao {
@Insert
public fun insertUser (user:User)
@Update
public fun updateUser (user:User)
@Delete
public fun  deleteUser (user:User)
@Query("DELETE FROM user_table")
public fun deleteAll()
@Query("SELECT * FROM user_table")
fun getAllUsers(): LiveData<List<User>>

}

要有一个视图模型的实例,你必须这样做:

class MainActivity : AppCompatActivity() {
lateinit var binding : ActivityMainBinding
private val userviewModel by viewModels<UserviewModel >()
...
}
我建议大家使用AndroidViewModel
class UserViewModel(application: Application): AndroidViewModel(application){
private val mDataRepository by lazy { UserRepository(application) }
..
}

您也可以查看Android开发者网站

最新更新