web-dev-qa-db-ger.com

AppCompatActivity implementiert LifecycleOwner nicht

Ich verwende Android Support Library 26.1.0. Dies sind die Abhängigkeiten im App-Modul -

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"

Aber wenn ich versuche, ViewModel wie unten zu verwenden -

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

Es wird ein Fehler bei this angezeigt und die Fehlermeldung lautet Wrong first argument type Found: packagename.BrowseActivity, required: Android.Arch.lifecycle.LifecycleOwner. (Obwohl die Unterstützungsbibliotheksversion 26.1+ ist und bereits LifecycleOwner implementiert)

Ich habe auch versucht, LifecycleRegistryOwner zu implementieren, das ich in diesem Beispiel gefunden habe, und das funktioniert auch nicht. Bitte schlagen Sie eine Lösung vor und lassen Sie mich wissen, wenn ich etwas falsch mache.

Bearbeiten 1 - Dies ist die Aktivitätsklasse

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);
                }
            });
    }
    ....
}

Dies ist die ViewModel-Klasse

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

Dasselbe Problem hier, also musste ich meine androidx.appcompat-Abhängigkeit wie folgt aktualisieren:

implementation 'androidx.appcompat:appcompat:1.1.0-alpha04'
17

Sie müssen dies nicht mehr implementieren.

Erweitern Sie einfach Ihre Aktivität mit AppCompatActivity, das LifecycleOwner erweitert.

Diese Schnittstelle wurde in API-Version 1.0.0 als veraltet eingestuft. Verwenden Sie Android.support.v7.app.AppCompatActivity, um LifecycleOwner zu erweitern. Daher gibt es für diese Klasse keine Anwendungsfälle.

Sie haben vergessen zu überschreiben

private final LifecycleRegistry lifecycleRegistry = new LifecycleRegistry(this);

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

Sie benötigen mindestens Support-Lib 26.1

Gleiches gilt für Fragmente. Erweitern Sie einfach Ihr Fragment um LifecycleFragment, wodurch Android.support.v4.app.Fragment

Bearbeiten: Einfach ein schnelles Beispielprojekt mit Kotlin neu erstellt und es hat funktioniert.

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>()
}

Bearbeiten:

Bei der Verwendung der Arch-Version Beta1 ist ein Problem aufgetreten. Erwägen Sie die Verwendung von 1.0.0-alpha9-1, bis dies behoben ist. In meinem Fall hat es nicht funktioniert, wenn ich Beta1 verwende, sondern mit Alpha 9-1

8
Emanuel S

benutze Android jetpack, es wird dein Problem lösen

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

6