web-dev-qa-db-fra.com

AppCompatActivity ne met pas en œuvre LifecycleOwner

J'utilise Android Support Library 26.1.0. Ce sont les dépendances dans le module d'application -

implementation "Android.Arch.lifecycle:runtime:1.0.0"
implementation "Android.Arch.lifecycle:extensions:1.0.0-beta1"
implementation "Android.Arch.persistence.room:rxjava2:1.0.0-beta1"
implementation "Android.Arch.lifecycle:common-Java8:1.0.0-beta1"
annotationProcessor "Android.Arch.lifecycle:compiler:1.0.0-beta1"

Mais quand j'essaie d'utiliser ViewModel comme ci-dessous -

mUserViewModel.getUsers().observe(this,
            (Observer<Resource<List<UserView>>>) listResource -> {
                if(listResource != null){
                    this.handleDataState(listResource.status, listResource.data, listResource.message);
                }
            });

Il affiche une erreur à this et le message d'erreur est Wrong first argument type Found: packagename.BrowseActivity, required: Android.Arch.lifecycle.LifecycleOwner. (Bien que la version de la bibliothèque de support soit 26.1+, qui implémente déjà LifecycleOwner)

J'ai également essayé d'implémenter LifecycleRegistryOwner que j'ai trouvé dans ce exemple et cela ne fonctionne pas non plus. Veuillez suggérer une solution et faites-moi savoir si je fais quelque chose de mal.

Modifier 1 - Ceci est la classe d'activité

import Android.Arch.lifecycle.Observer;
import Android.Arch.lifecycle.ViewModelProviders;
import Android.os.Bundle;
import Android.support.v7.app.AppCompatActivity;
import Android.support.v7.widget.LinearLayoutManager;
import Android.support.v7.widget.RecyclerView;
import Android.view.View;
import Android.widget.ProgressBar;

import com.github.amitkma.boilerplate.app.R;
import com.github.amitkma.boilerplate.app.mapper.UserMapper;
import com.github.amitkma.boilerplate.app.model.UserModel;
import com.github.amitkma.boilerplate.app.ui.widget.EmptyView;
import com.github.amitkma.boilerplate.app.ui.widget.ErrorView;
import com.github.amitkma.boilerplate.presentation.data.Resource;
import com.github.amitkma.boilerplate.presentation.data.ResourceState;
import com.github.amitkma.boilerplate.presentation.factory.ViewModelFactory;
import com.github.amitkma.boilerplate.presentation.viewmodel.UserViewModel;
import com.github.amitkma.boilerplate.presentation.vo.UserView;

import Java.util.ArrayList;
import Java.util.List;

import javax.inject.Inject;

import dagger.Android.AndroidInjection;

public class BrowseActivity extends AppCompatActivity {

    @Inject
    UserAdapter mUserAdapter;
    @Inject
    UserMapper mUserMapper;
    @Inject
    ViewModelFactory mViewModelFactory;
    private UserViewModel mUserViewModel;

    private RecyclerView mRecyclerView;
    private ProgressBar mProgressBar;
    private ErrorView mErrorView;
    private EmptyView mEmptyView;


   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       AndroidInjection.inject(this);
       setContentView(R.layout.activity_browse);
       mUserViewModel = ViewModelProviders.of(this, mViewModelFactory)
            .get(UserViewModel.class);

       mRecyclerView = findViewById(R.id.recycler_browse);
       mProgressBar = findViewById(R.id.progress);
       mEmptyView = findViewById(R.id.view_empty);
       mErrorView = findViewById(R.id.view_error);

       setupBrowseRecycler();
       setupViewListeners();
   }

    @Override
    protected void onStart() {
        super.onStart();
        mUserViewModel.getUsers().observe(this,
            (Observer<Resource<List<UserView>>>) listResource -> {
                if(listResource != null){
                    this.handleDataState(listResource.status, listResource.data, listResource.message);
                }
            });
    }
    ....
}

Il s'agit de la classe ViewModel

import Android.Arch.lifecycle.LiveData;
import Android.Arch.lifecycle.MutableLiveData;
import Android.Arch.lifecycle.ViewModel;

import com.github.amitkma.boilerplate.domain.interactor.GetUserList;
import com.github.amitkma.boilerplate.domain.model.User;
import com.github.amitkma.boilerplate.presentation.data.Resource;
import com.github.amitkma.boilerplate.presentation.data.ResourceState;
import com.github.amitkma.boilerplate.presentation.mapper.UserMapper;
import com.github.amitkma.boilerplate.presentation.vo.UserView;

import Java.util.ArrayList;
import Java.util.List;

import javax.inject.Inject;

import io.reactivex.subscribers.DisposableSubscriber;

public class UserViewModel extends ViewModel {

    private final GetUserList mGetUserList;
    private final UserMapper mUserMapper;

    @Inject
    public UserViewModel(GetUserList getUserList,
            UserMapper userMapper) {
        mGetUserList = getUserList;
        mUserMapper = userMapper;
        fetchUsers();
    }

    public void fetchUsers(){
        mUserMutableLiveData.postValue(new Resource(ResourceState.LOADING, null, null));
        mGetUserList.execute(new UserSubscriber(), null);
    }

    public LiveData<Resource<List<UserView>>> getUsers(){
        return mUserMutableLiveData;
    }

    @Override
    protected void onCleared() {
        mGetUserList.dispose();
        super.onCleared();
    }

    private final MutableLiveData<Resource<List<UserView>>> mUserMutableLiveData =
        new MutableLiveData<>();

}

13
Amit Kumar

Même problème ici, j'ai donc dû mettre à jour ma dépendance androidx.appcompat, comme ci-dessous:

implementation 'androidx.appcompat:appcompat:1.1.0-alpha04'
17
Thales Pupo Araujo

Vous n'avez plus besoin de l'implémenter.

Développez simplement votre activité avec AppCompatActivity qui étend LifecycleOwner.

Cette interface est déconseillée au niveau API 1.0.0. Utilisez Android.support.v7.app.AppCompatActivity qui étend LifecycleOwner, il n'y a donc pas de cas d'utilisation pour cette classe.

Vous avez oublié de remplacer

private final LifecycleRegistry lifecycleRegistry = new LifecycleRegistry(this);

@Override
public LifecycleRegistry getLifecycle() {
    return lifecycleRegistry;
}

Vous avez besoin d'au moins Support-Lib 26.1

Idem pour les fragments. Étendez simplement votre fragment de LifecycleFragment qui étend Android.support.v4.app.Fragment

Edit: Juste reconstruit un exemple de projet rapide en utilisant Kotlin et cela a fonctionné.

class MainActivity : AppCompatActivity(), HasSupportFragmentInjector, AnkoLogger {
    private val lifecycleRegistry by lazy { Android.Arch.lifecycle.LifecycleRegistry(this) }
    private val viewModel by lazy { ViewModelProviders.of(this, viewModelFactory).get(BridgesVm::class.Java) }
    override fun getLifecycle() = lifecycleRegistry

    public override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        viewModel.data.observe(this, Observer<Bridge?> { info { "Received" } })
   }
}

class BridgesVm @Inject constructor() : ViewModel() { 
        val data: LiveData<Bridge> = MutableLiveData<Bridge>()
}

Modifier:

Il y a un problème avec Arch version beta1. Envisagez d'utiliser 1.0.0-alpha9-1 jusqu'à ce que ce problème soit résolu. Dans mon cas, cela ne fonctionnait pas si j'utilisais la beta1 mais que je travaillais avec alpha 9-1

8
Emanuel S

utilisez Android jetpack, cela résoudra votre problème

implementation 'androidx.appcompat:appcompat:1.1.0-rc01'

6
Sachidananda Sahu