Viewmodel 无法创建 class Android Java MVVM 的实例
Viewmodel cannot create an instance of class Android Java MVVM
我正在尝试实现一个允许浏览电影并检查它们的评级的电影应用程序...当我尝试使用我的 MovieListViewModel 实现 MVVM 模型时我遇到了问题,调试器告诉我我无法创建此 class (MovieListViewModel) 的实例。
我所做的是尝试遵循一些教程,并在该站点中寻找有关视图模型的所有问题,他们通常会说我应该将视图模型的构造函数作为 public 构造函数或那里是构造函数中的其他一些问题(参数和类似的东西)但我确定我遵循了关于构造函数的指南
(我尝试按照本教程来实现我的应用程序的第一部分)
https://medium.com/@eladb4382/paging-library-viewmodel-livedata-room-and-retrofit-66bf6a0eef9d
我做了基本上相同的代码,但我有他没有的错误...
这是我的列表视图模型 class :
public class MovieListViewModel 扩展了 AndroidViewModel {
private MovieRepository repository;
public MovieListViewModel(@NonNull Application application) {
super(application);
repository = MovieRepository.getInstance(application);
}
public LiveData<PagedList<Movie>> getMovies() {
return repository.getMovies();
}
public LiveData<NetworkState> getNetworkState() {
return repository.getNetworkState();
}}
问题出在哪里:
public class MovieListFragment 扩展 Fragment 实现 OnMovieItemClicked {
private final String TAG = MovieListFragment.class.getSimpleName() ;
protected MovieListViewModel viewmodel ;
private MovieDetailsViewModel movieDetailsViewModel ;
protected RecyclerView recyclerView ;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.movie_list_fragment , container , false );
recyclerView = view.findViewById(R.id.moviesRecyclerView);
recyclerView.setLayoutManager(new GridLayoutManager(getContext(),3));
Log.d(TAG , "creating viewmodel ..." );
viewmodel = ViewModelProviders.of(getActivity()).get(MovieListViewModel.class);
observersRegisters() ;
return view;
}
private void observersRegisters() {
final MovieAdapter adapter = new MovieAdapter(this);
viewmodel.getMovies().observe(this , adapter ::submitList);
viewmodel.getNetworkState().observe(this,networkState ->{
adapter.setNetworkState(networkState);
});
recyclerView.setAdapter(adapter);
movieDetailsViewModel = ViewModelProviders.of(getActivity()).get(MovieDetailsViewModel.class);
}
(这不是整个片段 class 它只是发生错误的部分)
和我称之为此片段的 activity 在这里 ::
public class MainActivity 扩展 AppCompatActivity {
private static final String TAG = MainActivity.class.getSimpleName() ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(findViewById(R.id.fragmentsContainer)!= null) {
if(savedInstanceState != null ){
return ;
}
MovieListFragment listFragment = new MovieListFragment() ;
listFragment.setArguments(getIntent().getExtras());
getSupportFragmentManager().beginTransaction().add(R.id.fragmentsContainer,listFragment).commit();
}}
我还在 GitHub 上上传了整个项目,以防有人想检查问题:
https://github.com/TheDeathLorD/MovieApp
这是我在 运行 时间遇到的错误:
E/AndroidRuntime:致命异常:main
进程:com.example.movieapp2,PID:4935
java.lang.RuntimeException: 无法创建 class com.example.movieapp2.ui.viewmodel.MovieListViewModel 的实例
在 android.arch.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:207)
在 android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:134)
在 android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:102)
在 com.example.movieapp2.ui.view.MovieListFragment.onCreateView(MovieListFragment.java:40)
在你的情况下,你应该看到整个日志,我试过你的代码,在你的错误下面有更多信息post:
Caused by: java.lang.IllegalArgumentException: baseUrl must end in /: http://api.themoviedb.org/3/movie/popular
at retrofit2.Retrofit$Builder.baseUrl(Retrofit.java:515)
at retrofit2.Retrofit$Builder.baseUrl(Retrofit.java:458)
at com.example.movieapp2.repository.network.api.MovieAPIClient.getInstance(MovieAPIClient.java:27)
at com.example.movieapp2.repository.network.paging.NetMoviePageKeyedDataSource.<init>(NetMoviePageKeyedDataSource.java:32)
at com.example.movieapp2.repository.network.paging.NetMovieDataSourceFactory.<init>(NetMovieDataSourceFactory.java:18)
at com.example.movieapp2.repository.MovieRepository.<init>(MovieRepository.java:27)
at com.example.movieapp2.repository.MovieRepository.getInstance(MovieRepository.java:56)
这意味着您应该在 baseUrl
之后添加一个 /
然后你会看到另一个崩溃说 Missing either @GET URL or @Url parameter
。因为@GET URL在MovieAPIInterface.getMovies
中是空白的,所以建议你把baseUrl改成http://api.themoviedb.org/3/movie
然后把popular
放到@GET注解
您正在使用这行代码在片段中填充您的视图模型
viewmodel = ViewModelProviders.of(getActivity()).get(MovieListViewModel.class);
因为 getActivity()
我觉得有点不对劲。您的片段需要一个视图模型而不是 activity 所以试试这个
viewmodel = ViewModelProviders.of(this).get(MovieListViewModel.class);
通过传递 this
这是您的片段,您的问题可能会得到解决。
就我而言,我的 ViewModel class 中传递了参数!
我删除了它并解决了我的问题。
class MainViewModel(private val repository: Repository) : ViewModel() {
只需删除 arg,因为我不需要那个 arg,而且是额外的 :
class MainViewModel() : ViewModel() {
我正在尝试实现一个允许浏览电影并检查它们的评级的电影应用程序...当我尝试使用我的 MovieListViewModel 实现 MVVM 模型时我遇到了问题,调试器告诉我我无法创建此 class (MovieListViewModel) 的实例。
我所做的是尝试遵循一些教程,并在该站点中寻找有关视图模型的所有问题,他们通常会说我应该将视图模型的构造函数作为 public 构造函数或那里是构造函数中的其他一些问题(参数和类似的东西)但我确定我遵循了关于构造函数的指南
(我尝试按照本教程来实现我的应用程序的第一部分) https://medium.com/@eladb4382/paging-library-viewmodel-livedata-room-and-retrofit-66bf6a0eef9d 我做了基本上相同的代码,但我有他没有的错误...
这是我的列表视图模型 class :
public class MovieListViewModel 扩展了 AndroidViewModel {
private MovieRepository repository;
public MovieListViewModel(@NonNull Application application) {
super(application);
repository = MovieRepository.getInstance(application);
}
public LiveData<PagedList<Movie>> getMovies() {
return repository.getMovies();
}
public LiveData<NetworkState> getNetworkState() {
return repository.getNetworkState();
}}
问题出在哪里:
public class MovieListFragment 扩展 Fragment 实现 OnMovieItemClicked {
private final String TAG = MovieListFragment.class.getSimpleName() ;
protected MovieListViewModel viewmodel ;
private MovieDetailsViewModel movieDetailsViewModel ;
protected RecyclerView recyclerView ;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.movie_list_fragment , container , false );
recyclerView = view.findViewById(R.id.moviesRecyclerView);
recyclerView.setLayoutManager(new GridLayoutManager(getContext(),3));
Log.d(TAG , "creating viewmodel ..." );
viewmodel = ViewModelProviders.of(getActivity()).get(MovieListViewModel.class);
observersRegisters() ;
return view;
}
private void observersRegisters() {
final MovieAdapter adapter = new MovieAdapter(this);
viewmodel.getMovies().observe(this , adapter ::submitList);
viewmodel.getNetworkState().observe(this,networkState ->{
adapter.setNetworkState(networkState);
});
recyclerView.setAdapter(adapter);
movieDetailsViewModel = ViewModelProviders.of(getActivity()).get(MovieDetailsViewModel.class);
}
(这不是整个片段 class 它只是发生错误的部分)
和我称之为此片段的 activity 在这里 ::
public class MainActivity 扩展 AppCompatActivity {
private static final String TAG = MainActivity.class.getSimpleName() ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(findViewById(R.id.fragmentsContainer)!= null) {
if(savedInstanceState != null ){
return ;
}
MovieListFragment listFragment = new MovieListFragment() ;
listFragment.setArguments(getIntent().getExtras());
getSupportFragmentManager().beginTransaction().add(R.id.fragmentsContainer,listFragment).commit();
}}
我还在 GitHub 上上传了整个项目,以防有人想检查问题:
https://github.com/TheDeathLorD/MovieApp
这是我在 运行 时间遇到的错误:
E/AndroidRuntime:致命异常:main 进程:com.example.movieapp2,PID:4935 java.lang.RuntimeException: 无法创建 class com.example.movieapp2.ui.viewmodel.MovieListViewModel 的实例 在 android.arch.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:207) 在 android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:134) 在 android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:102) 在 com.example.movieapp2.ui.view.MovieListFragment.onCreateView(MovieListFragment.java:40)
在你的情况下,你应该看到整个日志,我试过你的代码,在你的错误下面有更多信息post:
Caused by: java.lang.IllegalArgumentException: baseUrl must end in /: http://api.themoviedb.org/3/movie/popular
at retrofit2.Retrofit$Builder.baseUrl(Retrofit.java:515)
at retrofit2.Retrofit$Builder.baseUrl(Retrofit.java:458)
at com.example.movieapp2.repository.network.api.MovieAPIClient.getInstance(MovieAPIClient.java:27)
at com.example.movieapp2.repository.network.paging.NetMoviePageKeyedDataSource.<init>(NetMoviePageKeyedDataSource.java:32)
at com.example.movieapp2.repository.network.paging.NetMovieDataSourceFactory.<init>(NetMovieDataSourceFactory.java:18)
at com.example.movieapp2.repository.MovieRepository.<init>(MovieRepository.java:27)
at com.example.movieapp2.repository.MovieRepository.getInstance(MovieRepository.java:56)
这意味着您应该在 baseUrl
之后添加一个/
然后你会看到另一个崩溃说 Missing either @GET URL or @Url parameter
。因为@GET URL在MovieAPIInterface.getMovies
中是空白的,所以建议你把baseUrl改成http://api.themoviedb.org/3/movie
然后把popular
放到@GET注解
您正在使用这行代码在片段中填充您的视图模型
viewmodel = ViewModelProviders.of(getActivity()).get(MovieListViewModel.class);
因为 getActivity()
我觉得有点不对劲。您的片段需要一个视图模型而不是 activity 所以试试这个
viewmodel = ViewModelProviders.of(this).get(MovieListViewModel.class);
通过传递 this
这是您的片段,您的问题可能会得到解决。
就我而言,我的 ViewModel class 中传递了参数! 我删除了它并解决了我的问题。
class MainViewModel(private val repository: Repository) : ViewModel() {
只需删除 arg,因为我不需要那个 arg,而且是额外的 :
class MainViewModel() : ViewModel() {