Котлин, не может создать экземпляр класса ViewmodelAndroid

Форум для тех, кто программирует под Android
Ответить
Гость
 Котлин, не может создать экземпляр класса Viewmodel

Сообщение Гость »

Я новичок в архитектуре MVVM, я пробовал разные варианты, но все равно получаю то же исключение «не могу создать экземпляр ViewModel».
Я использую Android Studio Iguana
ниже моя видеоактивность:

Код: Выделить всё

class VideoActivity : AppCompatActivity() {
private lateinit var viewModel: VideoViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

viewModel = ViewModelProvider(this).get(VideoViewModel::class.java)

val videos= listOf(
Video(id = 1, url = "url1.mp4"),
Video(id = 1, url = "url2.mp4"),
Video(id = 1, url = "url3.mp4"),
Video(id = 1, url = "url4.mp4"),
Video(id = 1, url = "url5.mp4"),
)

viewModel.downloadVideos(videos)

viewModel.videos.observe(this) { downloadedVideos ->
if (downloadedVideos.isNotEmpty()) {
viewModel.playNextVideo()
}
}
}
}
ниже приведен мой класс VideoRepository

Код: Выделить всё

    class VideoRepository(private val context: Context) {

suspend fun downloadVideos(videos: List): List {
val downloadedVideos = mutableListOf()
for (video in videos) {
val filePath = downloadVideo(video.url)
if (filePath.isNotBlank()) {
video.downloadStatus = DownloadStatus.DOWNLOADED
video.filePath = filePath
downloadedVideos.add(video)
}
}
return downloadedVideos
}

private suspend fun downloadVideo(videoUrl: String): String = withContext(Dispatchers.IO) {
try {
val url = URL(videoUrl)
val connection = url.openConnection() as HttpURLConnection
connection.connect()

val inputStream: InputStream = connection.inputStream
val file = File(context.getExternalFilesDir(Environment.DIRECTORY_MOVIES), "video_${System.currentTimeMillis()}.mp4")
val outputStream = FileOutputStream(file)

val buffer = ByteArray(1024)
var bytesRead: Int
while (inputStream.read(buffer).also { bytesRead = it } != -1) {
outputStream.write(buffer, 0, bytesRead)
}

outputStream.flush()
outputStream.close()
inputStream.close()

file.absolutePath
} catch (e: Exception) {
e.printStackTrace()
""
}
}

fun playVideo(video: Video) {
val videoView = (context as VideoActivity).findViewById(R.id.video_view)
videoView.setVideoURI(Uri.parse(video.filePath))
videoView.start()
}
}

class VideoViewModel(var repository: VideoRepository) : ViewModel(){

private val _videos = MutableLiveData()
val videos:LiveData  = _videos

private lateinit var videoView: VideoView

private var currentVideoIndex = 0
fun downloadVideos(videos: List){
viewModelScope.launch {
val downloadVideos = repository.downloadVideos(videos)
_videos.postValue(downloadVideos)
}
}

fun playNextVideo(){
currentVideoIndex = (currentVideoIndex + 1) % (videos.value?.size ?: 1)
val video = videos.value?.get(currentVideoIndex)
video?.let{
repository.playVideo(it)
}
}
}
Зависимости приложения Gradle:

Код: Выделить всё

implementation(libs.androidx.core.ktx)
implementation(libs.androidx.lifecycle.runtime.ktx)
implementation(libs.androidx.activity.compose)
implementation(platform(libs.androidx.compose.bom))
implementation(libs.androidx.ui)
implementation(libs.androidx.ui.graphics)
implementation(libs.androidx.ui.tooling.preview)
implementation(libs.androidx.material3)

implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1")
implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.3.1")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.0")
implementation(libs.androidx.appcompat)
Ниже показано исключение, которое я получаю

Код: Выделить всё

Process: com.android, PID: 4717
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android/com.android.main.VideoActivity}: java.lang.RuntimeException: Cannot create an instance of class com.android.main.VideoViewModel
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3825)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3971)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101)
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:2389)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:210)
at android.os.Looper.loop(Looper.java:299)
at android.app.ActivityThread.main(ActivityThread.java:8261)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:559)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:954)
Caused by: java.lang.RuntimeException:  Cannot create an instance of class com.android.main.VideoViewModel
at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.kt:201)
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:320)
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:302)
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:276)
at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.kt:128)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:184)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:150)
at com.android.main.VideoActivity.onCreate(VideoActivity.kt:20)
at android.app.Activity.performCreate(Activity.java:8516)
at android.app.Activity.performCreate(Activity.java:8480)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1418)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3806)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3971) 
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101) 
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:2389) 
at android.os.Handler.dispatchMessage(Handler.java:106) 
at android.os.Looper.loopOnce(Looper.java:210) 
at android.os.Looper.loop(Looper.java:299) 
at android.app.ActivityThread.main(ActivityThread.java:8261) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:559) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:954) 
Caused by: java.lang.NoSuchMethodException: com.android.adbeets.main.VideoViewModel.  []
at java.lang.Class.getConstructor0(Class.java:3325)
at java.lang.Class.getDeclaredConstructor(Class.java:3063)
at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.kt:199)
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:320) 
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:302) 
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:276) 
at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.kt:128) 
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:184) 
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:150) 
at com.android.adbeets.main.VideoActivity.onCreate(VideoActivity.kt:20) 
at android.app.Activity.performCreate(Activity.java:8516) 
at android.app.Activity.performCreate(Activity.java:8480) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1418) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3806) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3971) 
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101) 
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:2389) 
at android.os.Handler.dispatchMessage(Handler.java:106) 
at android.os.Looper.loopOnce(Looper.java:210) 
at android.os.Looper.loop(Looper.java:299) 
at android.app.ActivityThread.main(ActivityThread.java:8261) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:559) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:954) 
2024-04-09 12:06:35.424 24478-30209 ActivityManagerWrapper  com.miui.home                        E
Может ли кто-нибудь помочь мне в этом вопросе?
Заранее спасибо

Подробнее здесь: https://stackoverflow.com/questions/782 ... -viewmodel
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»