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<>();
}
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'
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
utilisez Android jetpack, cela résoudra votre problème
implementation 'androidx.appcompat:appcompat:1.1.0-rc01'