Android Studio: исключение ViewModel - PullRequest
1 голос
/ 14 марта 2020

Я пытаюсь создать модель представления учебника YouTube, которая должна показывать все записи из базы данных (но на этом этапе она должна отображать только тост, так как пока нет представления Recycler)

Я получаю следующее исключение при открытии действия:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.tutorial/com.example.tutorial.Activity2}: java.lang.RuntimeException: Cannot create an instance of class com.example.tutorial.EventViewModel

......

at com.example.tutorial.Activity2.onCreate(Activity2.java:23)

Класс выглядит следующим образом:

public class Activity2 extends AppCompatActivity {
    private EventViewModel eventViewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_2);

        eventViewModel = new ViewModelProvider(this).get(EventViewModel.class);
        eventViewModel.getAllEvents().observe(this, new Observer<List<Event>>() {
            @Override
            public void onChanged(List<Event> events) {
                Toast.makeText(Activity2.this, "thhthth", Toast.LENGTH_SHORT).show();
            }
        });

    }
}

ViewModel Class:

public class EventViewModel extends AndroidViewModel {
    private EventRepository repository;
    private LiveData<List<Event>> allEvents;

    public EventViewModel(@NonNull Application application) {
        super(application);
        repository = new EventRepository(application);
        allEvents = repository.getAllEvents();
    }

    public void insert(Event event) {
        repository.insert(event);
    }

    public void update(Event event) {
        repository.update(event);
    }

    public void delete(Event event) {
        repository.delete(event);
    }

    public LiveData<List<Event>> getAllEvents() {
        return allEvents;
    }


}

Как я могу это исправить? (все еще Android новичок, кстати: ^))

Заранее спасибо!

Ответы [ 4 ]

2 голосов
/ 19 марта 2020

Это будет нормально работать:

1. Go в ваш build.gradle (Модуль: приложение) и добавьте это в зависимости:

`implementation "android.arch.lifecycle:extensions:$lifecycle_version"`  

убедитесь, что у вас есть def lifecycle_version = "2.2.0" в ваших зависимостях.
Так что это должно выглядеть так:

dependencies {

    def lifecycle_version = "2.2.0"  //make sure to have this 

    //Some implementations ...  

    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'


    implementation "android.arch.lifecycle:extensions:$lifecycle_version" // make sure to have this too.

}  

2. Go к вашей Деятельности (в вашем случае это Activity2) и поместите эту строку:

eventViewModel = new ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory.getInstance(this.getApplication())).get(EventViewModel.class);  

Ваш код должен выглядеть следующим образом:

public class Activity2 extends AppCompatActivity {
    private EventViewModel eventViewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_2);

        eventViewModel = new ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory.getInstance(this.getApplication())).get(EventViewModel.class);
        eventViewModel.getAllEvents().observe(this, new Observer<List<Event>>() {
            @Override
            public void onChanged(List<Event> events) {
                Toast.makeText(Activity2.this, "enjoy :)", Toast.LENGTH_SHORT).show();
            }
        });

    }
}  

3. Запустите приложение.

0 голосов
/ 26 марта 2020

потому что "ViewModelProviders" устарела, для java программистов используйте это: 100% сработает

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    noteViewModel = new ViewModelProvider(this
            , ViewModelProvider.AndroidViewModelFactory.getInstance(this.getApplication()))
            .get(NoteViewModel.class);

    noteViewModel.getAllNotes().observe(this, new Observer<List<Note>>() {
        @Override
        public void onChanged(List<Note> notes) {

            Toast.makeText(MainActivity.this, "Onchange ", Toast.LENGTH_SHORT).show();
        }
    });

Go в ваш build.gradle ( Модуль: приложение)

def lifecycle_version = "2.2.0"
def room_version = "2.2.5"
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
// LiveData
implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version"
annotationProcessor "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"

implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
0 голосов
/ 17 марта 2020

Вы должны определить «eventViewModel» в методе onCreate и не создавать общую переменную.

public class Activity2 extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_2);

        EventViewModel eventViewModel = new ViewModelProvider(this).get(EventViewModel.class);
        ...
    }
}
0 голосов
/ 15 марта 2020

Ваша viewModel расширяет AndroidViewModel. Использовать AndroidViewModelFactory:

yourViewModel = new ViewModelProvider.AndroidViewModelFactory(getApplication()).create(YourViewModel.class);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...