Activity 无法转换为 LifecycleOwner

Posted

技术标签:

【中文标题】Activity 无法转换为 LifecycleOwner【英文标题】:Activity cannot be converted to LifecycleOwner 【发布时间】:2018-12-01 06:19:40 【问题描述】:

我想将 Room 与 LiveData 一起使用,在其他项目中我已经使用过它,但在这个项目中,我无法让它工作。当我尝试观察 livedata 时,它无法将我的活动转换为生命周期活动,但是,我正在使用 AppCompatActivity,我什至尝试覆盖 getLifecycle 方法(在以前的项目中对我有用)。我什至尝试过使用 androidX 但仍然是同样的问题:(

这是我的活动(部分):

import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleRegistry;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;

private LifecycleRegistry mLifecycleRegistry;

public class actMain extends AppCompatActivity  

 @Override
protected void onCreate(@Nullable Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);

    mLifecycleRegistry = new LifecycleRegistry(this);
    mLifecycleRegistry.markState(Lifecycle.State.CREATED);

  @Override
public void onStart() 
    super.onStart();
    EventBus.getDefault().register(this);
    //Firebase
    db = FirebaseFirestore.getInstance();

    mLifecycleRegistry.markState(Lifecycle.State.STARTED);

    alarmViewModel = ViewModelProviders.of(this).get(AlarmViewModel.class);

    alarmViewModel.getAlarmList().observe(actMain.class, new 
    Observer<List<Alarm>>() 
        @Override
        public void onChanged(@Nullable List<Alarm> alarms) 

        
    );

@NonNull
@Override
public Lifecycle getLifecycle() 
    return mLifecycleRegistry;

这是我的 gradle 文件:

implementation 'androidx.room:room-runtime:2.0.0-alpha1'
annotationProcessor 'androidx.room:room-compiler:2.0.0-alpha1'
implementation 'com.google.android.material:material:1.0.0-alpha3'
implementation  'androidx.lifecycle:lifecycle-viewmodel:2.0.0-alpha1'
implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0-alpha1'

这是我的道:

@Dao
public interface AlarmDao 

    @Query("SELECT * FROM alarm")
    LiveData<List<Alarm>> getAllAlarm();

    @Insert
    void insert(Alarm... alarms);

    @Update
    void update(Alarm... alarms);

    @Delete
    void delete(Alarm... alarms);


我在这里尝试了所有建议,包括我的建议,但我无法弄清楚这种情况下的问题是什么。

编辑: 添加代码

【问题讨论】:

你扩展了 AppCompatActivity 吗? 是的,我忘记将那部分添加到我的代码中。 支持库 27 还是 28?虽然它似乎是androidx 所以可能是 28 是的,这就是我完全迷失的原因,我正在研究两个项目,一个正在运行,另一个没有...... 【参考方案1】:

你不需要使用

mLifecycleRegistry = new LifecycleRegistry(this);
mLifecycleRegistry.markState(Lifecycle.State.CREATED);

因为,新的AppcompatActivity 已经是lifecyclerOwner

您还观察到类对象,这是不正确的。 actMain.class 是一个类对象。 你应该有:

alarmViewModel.getAlarmList().observe(this, new Observer<List<Alarm>>() 
     @Override
     public void onChanged(@Nullable List<Alarm> alarms) 
);

【讨论】:

我感觉很愚蠢知道...但无论如何非常感谢您的帮助! :) 你救了我!谢谢!【参考方案2】:

升级到最新版本。 以下是我的项目的参考 AppCompatActivity 现在继承自 LifecycleOwner,您可以直接实现所需的功能。

implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.core:core-ktx:1.0.1'
implementation 'com.google.android.material:material:1.0.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'

implementation 'androidx.cardview:cardview:1.0.0'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.recyclerview:recyclerview:1.0.0'
implementation 'org.jetbrains.anko:anko:0.10.8'
implementation 'com.github.debop:koda-time:1.2.1'


implementation 'androidx.annotation:annotation:1.0.2'
implementation "androidx.legacy:legacy-support-core-utils:1.0.0"


// Room components
implementation "androidx.room:room-runtime:2.0.0"
annotationProcessor "androidx.room:room-compiler:2.0.0"

// Lifecycle components
implementation "androidx.lifecycle:lifecycle-runtime:2.0.0"
implementation "androidx.lifecycle:lifecycle-extensions:2.0.0"
annotationProcessor "androidx.lifecycle:lifecycle-compiler:2.0.0"

// Coroutines
implementation  "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.1"
implementation  "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.1.1"

在此处查看示例https://codelabs.developers.google.com/codelabs/android-room-with-a-view-kotlin/#13

您也可以参考https://github.com/googlesamples/android-architecture-components/tree/master/BasicSample的基本示例

【讨论】:

以上是关于Activity 无法转换为 LifecycleOwner的主要内容,如果未能解决你的问题,请参考以下文章

FlutterBoost 3.0出现 Activity无法转换为ExclusiveAppComponent<Activity>的解决办法

android.view.ContextThemeWrapper 无法转换为 android.app.Activity

admin_signin活动无法转换为android.app.activity

如何解决这个错误。 com.google.android.gms.tasks.task executors$zza 无法转换为 android.app.activity。我是 Java 和 Andro

无法在自定义适配器中将 EditText 转换为 TextView

XmlPullAttributes无法强制转换为XmlBlockParser