android - 无法在Android MVVM中创建ViewModel类的实例

标签 android mvvm repository instance viewmodel

我正在学习android MVVM模式android开发。我想创建一个recycclerview Activity 以显示来自服务器的数据。但这不接受我的viewmodel类。波纹管是我的logcat错误。

LOGCAT

2020-04-12 21:03:18.026 2008-2008/com.shovon.mvvm E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.shovon.mvvm, PID: 2008
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.shovon.mvvm/com.shovon.mvvm.activity.RecyclerActivity}: java.lang.RuntimeException: Cannot create an instance of class com.shovon.mvvm.viewmodel.RecyclerActivityViewModel
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
    at android.os.Handler.dispatchMessage(Handler.java:107)
    at android.os.Looper.loop(Looper.java:214)
    at android.app.ActivityThread.main(ActivityThread.java:7356)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
 Caused by: java.lang.RuntimeException: Cannot create an instance of class com.shovon.mvvm.viewmodel.RecyclerActivityViewModel
    at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:221)
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:187)
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150)
    at com.shovon.mvvm.activity.RecyclerActivity.onCreate(RecyclerActivity.kt:23)
    at android.app.Activity.performCreate(Activity.java:7802)
    at android.app.Activity.performCreate(Activity.java:7791)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) 
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) 
    at android.os.Handler.dispatchMessage(Handler.java:107) 
    at android.os.Looper.loop(Looper.java:214) 
    at android.app.ActivityThread.main(ActivityThread.java:7356) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 
 **Caused by: java.lang.InstantiationException: java.lang.Class<com.shovon.mvvm.viewmodel.RecyclerActivityViewModel> has no zero argument constructor**
    at java.lang.Class.newInstance(Native Method)
    at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:219)
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:187) 
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150) 
    at com.shovon.mvvm.activity.RecyclerActivity.onCreate(RecyclerActivity.kt:23) 
    at android.app.Activity.performCreate(Activity.java:7802) 
    at android.app.Activity.performCreate(Activity.java:7791) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) 
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) 
    at android.os.Handler.dispatchMessage(Handler.java:107) 
    at android.os.Looper.loop(Looper.java:214) 
    at android.app.ActivityThread.main(ActivityThread.java:7356) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 

View 模型

这是我的viewmodel类。我正在从此 View 模型向 Activity 传递一些数据。但是问题是 Activity 不接受该 View 模型。也许viewmodel有任何问题。
class RecyclerActivityViewModel(application: Application) : AndroidViewModel(application) {

    val repository = RecyclerActivityRepository(application)


    fun userData(): LiveData<ArrayList<UserResponse>>{
        return repository.getUserData()
    }
}

仓库
class RecyclerActivityRepository(application: Application) {

    var liveData = MutableLiveData<ArrayList<UserResponse>>()
    private val userList = ArrayList<UserResponse>()
    private var adapter: UserAdapter? = null


    fun getUserData(): MutableLiveData<ArrayList<UserResponse>>{
        if (liveData == null){
            liveData = MutableLiveData<ArrayList<UserResponse>>()
        }

        RetrofitClient.instance.getUsers()
            .enqueue(object : Callback<List<UserResponse>> {
                override fun onFailure(call: Call<List<UserResponse>>, t: Throwable) {
                    Log.v("Retrofit", t.message.toString())
                }

                override fun onResponse(
                    call: Call<List<UserResponse>>,
                    response: Response<List<UserResponse>>
                ) {
                    Log.v("Retrofit", "Success")
                    Log.v("response_code", response.code().toString())
                    try {
                        userList.addAll(response.body()!!)
                        adapter?.notifyDataSetChanged()
                    }catch (e: Exception){
                        Log.v("error", e.message.toString())}
                }

            })
        return liveData
    }
}


Activity

这是我的逻辑代码
class RecyclerActivity : AppCompatActivity() {

private lateinit var viewModel: RecyclerActivityViewModel

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_recycler)
    viewModel = ViewModelProvider(this).get(RecyclerActivityViewModel::class.java)



}
}

最佳答案

这可能会有所帮助

viewModel= ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory.getInstance(this.getApplication())).get(RecyclerActivityViewModel::class.java)

关于android - 无法在Android MVVM中创建ViewModel类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61173893/

相关文章:

android - 如何在 Flutter 中获取用户从 Play 商店购买的商品

android - ViewPager setCurrentItem(n, false) 多次调用 instantiateItem - Android

AndroidViewModel 与 ViewModel

c# - 如何使用以编程方式创建的按钮在 WPF MVVM 中创建 OnClick 命令?

git - ! [远程拒绝] 镜像 git 存储库后出现错误

java - 方向更改时 fragment 重新启动

WPF - XAML - DataGridRow 样式触发器 IsMouseOver 工具提示数据绑定(bind)

centos - 如何修复类似 "required and installed (@@anaconda-CentOS-201303020151.x86_64/6.4)"的错误

mercurial - merge 两个不相关的 Mercurial 存储库后如何调整历史记录?

java - SharedPreferences 变量无法正常工作