簡體   English   中英

如何修復視圖模型的此錯誤? (在模擬器上運行程序時發生)

[英]How can I fix this error for view Model? (Occurs when running the program on the emulator)

在模擬器上運行程序時出錯:

2022-06-16 15:38:04.724 12519-12555/com.example.mvvm E/AwareLog:AtomicFileUtils:readFileLines 文件不存在:android.util.AtomicFile@5abc123 2022-06-16 15:38:04.725 12519-12555 /com.example.mvvm E/AwareLog:AtomicFileUtils:readFileLines 文件不存在:android.util.AtomicFile@30c1620 2022-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)

主要活動:

   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
}

}

用戶視圖模型:

  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?) {

}

}

用戶視圖模型工廠:

   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")
 }

}

用戶存儲庫:

   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開發者網站

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM