AppCompatActivity没有实现LifecycleOwner接口

19
我正在使用Android Support Library 26.1.0。这些是应用模块中的依赖项:
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"

但是当我尝试像下面这样使用ViewModel时:

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

this处显示错误,错误信息为错误的第一个参数类型:找到packagename.BrowseActivity,需要android.arch.lifecycle.LifecycleOwner。(尽管支持库版本是26.1+,已经实现了LifecycleOwner)

我还尝试了实现LifecycleRegistryOwner,在这个示例中找到,但也没有起作用。请提供解决方案,并告诉我是否有任何错误。

编辑 1 - 这是一个Activity类:

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

这是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<>();
}

1
你需要发布更多的代码。展示Activity的imports和类定义。 - Nick Shvelidze
我已经添加了代码,请看一下。 - Amit Kumar
我没有看到任何问题,除了你在ViewModel中导入了DisposableSubscriber,这是不必要的。 - Emanuel
我没有粘贴内部的Subscriber类,因为它与此问题无关。 - Amit Kumar
我已将版本设置为1.0.0-alpha9-1,它可以工作,然后我又将其替换为1.0.0-beta1,它仍然可以工作。不知道最初为什么不能工作。 - Amit Kumar
显示剩余2条评论
3个回答

21

我也遇到了同样的问题,所以我不得不更新我的androidx.appcompat依赖项,如下所示:

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

11

您不再需要实现这个了。

只需通过继承AppCompatActivity来扩展您的活动,它继承自LifecycleOwner。

此接口已在API级别1.0.0中弃用。使用继承自LifecycleOwner的android.support.v7.app.AppCompatActivity,因此不再需要使用此类。

您忘记重写了。

private final LifecycleRegistry lifecycleRegistry = new LifecycleRegistry(this);

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

您需要至少支持库 26.1

对于片段,只需通过 LifecycleFragment 扩展您的片段,它扩展了 android.support.v4.app.Fragment

编辑:刚刚使用 Kotlin 重新构建了一个快速示例项目,并且它可以工作。

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

编辑:

使用 arch 版本 beta1 存在问题。考虑在修复此问题之前使用 1.0.0-alpha9-1 版本。在我的情况下,如果我使用 beta1,则无法工作,但是使用 alpha 9-1 可以正常工作。


我已添加了 Activity 和 ViewModel 类代码,请查看一下。 - Amit Kumar
更新了。确保覆盖getLifecycle()方法。 - Emanuel
2
我已经尝试过了。 LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this); 问题依旧。它说LifecycleRegistry(LifecycleOwner)不能应用于packageName.BrowseActivity。 - Amit Kumar
我已经更新了我的代码并重新构建了一个非常快速的示例,它可以正常工作。请尝试使您的缓存失效,并仔细检查您的Gradle文件。 - Emanuel

7
使用Android Jetpack,它可以解决您的问题。
implementation 'androidx.appcompat:appcompat:1.1.0-rc01'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接