невозможно создать ViewModel - my_package.App нельзя преобразовать в android.arch.lifecycle.LifecycleOwner - PullRequest
0 голосов
/ 26 августа 2018

Я пытаюсь создать ViewModel в MainActivity, который наблюдает за некоторыми изменениями данных в каком-то одноэлементном компоненте.Цель состоит в том, чтобы использовать эту ViewModel в нескольких фрагментах этого действия.Но пока даже без привлечения фрагмента все же это не работает.Приложение зависает при запуске, печатает:

java.lang.RuntimeException: Unable to start activity ComponentInfo{my_package.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class my_package.MyViewModel

my_package.App cannot be cast to android.arch.lifecycle.LifecycleOwner 

Проблема, кажется, в строке: MyCustomSingletonComponent.getInstance().getSomeDataLiveData().observe......

Код:

public class MyCustomSingletonComponent
{
    public MutableLiveData<CustomClass> someData = new MutableLiveData<>(); 

    private static final MyCustomSingletonComponent instance = new MyCustomSingletonComponent();

    private MyCustomSingletonComponent() {
        someData = new MutableLiveData<>();
    }

    public static MyCustomSingletonComponent getInstance() {
        return instance;
    }

    public LiveData<CustomClass> getDataLiveData()
    {
        return someData;
    }

}


public class MyViewModel extends AndroidViewModel {

    public MyViewModel(@NonNull Application application) 
    {
        super(application);

        MyCustomSingletonComponent.getInstance().getSomeDataLiveData().observe(getApplication(), myData -> {
            ...  
        });
    }           
}

public class MainActivity extends AppCompatActivity
{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);

        ....
    }           
}

1 Ответ

0 голосов
/ 26 августа 2018

Во-первых, Application не является LifecycleOwner, поэтому вы не можете передать его observe() на LiveData.Действия и фрагменты являются стандартными владельцами жизненного цикла.

Во-вторых, ИМХО, ViewModel не должен ничего наблюдать.То, что использует ViewModel, делает наблюдение.MyViewModel может держаться за LiveData, но тогда наблюдает MainActivity.

...