我是 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<Video>): List<Video> {
val downloadedVideos = mutableListOf<Video>()
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<VideoView>(R.id.video_view)
videoView.setVideoURI(Uri.parse(video.filePath))
videoView.start()
}
}
class VideoViewModel(var repository: VideoRepository) : ViewModel(){
private val _videos = MutableLiveData<List<Video>>()
val videos:LiveData<List<Video>> = _videos
private lateinit var videoView: VideoView
private var currentVideoIndex = 0
fun downloadVideos(videos: List<Video>){
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.<init> []
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
有人可以帮我解决这个问题吗? 提前致谢
您的 viewModel 定义是旧的,请尝试使用新方法来初始化您的 viewModel。
将这些依赖项添加到您的项目中;
def activity_version = "1.8.2"
implementation "androidx.activity:activity-ktx:$activity_version"
删除你的
viewModel = ViewModelProvider(this).get(VideoViewModel::class.java)
线
将您的
private lateinit var viewModel: VideoViewModel
更新为 private val viewModel: VideoViewModel by viewModels()
希望这有帮助。