java AppCompatActivity 没有实现 LifecycleOwner

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/46465056/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-03 09:14:15  来源:igfitidea点击:

AppCompatActivity not implementing LifecycleOwner

javaandroidandroid-architecture-componentsandroid-architecture-lifecycle

提问by Amit Kumar

I am using Android Support Library 26.1.0. These are the dependencies in app module -

我正在使用 Android 支持库 26.1.0。这些是 app 模块中的依赖项 -

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"

But when I am trying to use ViewModel like below -

但是当我尝试使用如下所示的 ViewModel 时 -

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

It is showing error at thisand the error message is Wrong first argument type Found: packagename.BrowseActivity, required: android.arch.lifecycle.LifecycleOwner. (Although support library version is 26.1+ which already implements LifecycleOwner)

它在 处显示错误,this错误消息是Wrong first argument type Found: packagename.BrowseActivity, required: android.arch.lifecycle.LifecycleOwner。(虽然支持库版本是 26.1+ 已经实现了 LifecycleOwner)

I have also tried to implement LifecycleRegistryOwnerwhich I found in this sampleand this is also not working. Kindly suggest a solution and let me know if I am doing anything wrong.

我还尝试实现LifecycleRegistryOwner我在此示例中找到的内容,但这也不起作用。请提出解决方案,如果我做错了什么,请告诉我。

Edit 1- This is Activity class

编辑 1- 这是活动类

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

This is ViewModel Class

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

}

}

回答by Thales Pupo Araujo

Same problem here, so I had to update my androidx.appcompat dependency, like below:

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

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

回答by Emanuel S

You don't need to implement this anymore.

您不再需要执行此操作。

Just extend your activity by AppCompatActivity which extends LifecycleOwner.

只需通过扩展 LifecycleOwner 的 AppCompatActivity 扩展您的活动。

This interface was deprecated in API level 1.0.0. Use android.support.v7.app.AppCompatActivity which extends LifecycleOwner, so there are no use cases for this class.

此接口在 API 级别 1.0.0 中已弃用。使用扩展 LifecycleOwner 的 android.support.v7.app.AppCompatActivity,因此该类没有用例。

You forgot to override

你忘了覆盖

private final LifecycleRegistry lifecycleRegistry = new LifecycleRegistry(this);

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

You need at least Support-Lib 26.1

你至少需要 Support-Lib 26.1

Same for fragments. Just extend your Fragment by LifecycleFragmentwhich extends android.support.v4.app.Fragment

片段也一样。只需扩展您的 Fragment 由其LifecycleFragment扩展android.support.v4.app.Fragment

Edit: Just rebuilt a quick sample project using Kotlin and it worked.

编辑:刚刚使用 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>()
}

Edit:

编辑:

There's a problem using arch version beta1. Consider using 1.0.0-alpha9-1 until this is fixed. In my case it wasnt working if i use beta1 but working with alpha 9-1

使用 arch 版本 beta1 时出现问题。考虑使用 1.0.0-alpha9-1 直到它被修复。在我的情况下,如果我使用 beta1 但使用 alpha 9-1 则它不起作用

回答by Sachidananda Sahu

use android jetpack, it'll solve your problem

使用android jetpack,它会解决你的问题

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