标签: android-architecture-lifecycle

在不同Activity中的片段之间共享ViewModel

我有一个名为SharedViewModel的ViewModel:

public class SharedViewModel<T> extends ViewModel {

    private final MutableLiveData<T> selected = new MutableLiveData<>();


    public void select(T item) {
        selected.setValue(item);
    }

    public LiveData<T> getSelected() {
        return selected;
    }
}
Run Code Online (Sandbox Code Playgroud)

我在Google的Arch ViewModel参考页面上基于SharedViewModel示例实现它:

https://developer.android.com/topic/libraries/architecture/viewmodel.html#sharing_data_between_fragments

活动中的两个或更多个片段需要彼此通信是很常见的.这绝不是微不足道的,因为两个片段都需要定义一些接口描述,并且所有者活动必须将两者绑定在一起.而且,两个片段必须处理尚未创建或不可见的其他片段的情况.

我有两个片段,叫做ListFragmentDetailFragment.

到现在为止我用里面称这两个片段MasterActivity.一切都运作良好.

我得到了ViewModel ListFragment,选择了要使用它的值DetailFragment.

mStepSelectorViewModel = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
Run Code Online (Sandbox Code Playgroud)

但是,现在我需要在某些情况下ListFragment(将不同设备配置的布局)添加到另一个名为的活动中DetailActivity.有没有办法像上面的例子那样做?

android viewmodel android-fragments android-activity android-architecture-lifecycle

22
推荐指数
3
解决办法
1万
查看次数

如何在扩展LifecycleActivity的视图中设置SupportActionBar

我有一个扩展AppCompactActivity的Activity,在onCreate方法中我以通常的方式设置了Toolbarusing setSupportActionBar方法:

public class StepMasterActivity extends AppCompatActivity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_step_master);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);`
    }
}
Run Code Online (Sandbox Code Playgroud)

但是现在我有一个ViewModel组件,并在作为此活动的子代的片段之间共享数据并管理生命周期,我必须在Activity中获取此组件,因此我将其扩展为LifecycleActivity.

public class StepMasterActivity extends LifecycleActivity {

    @Override
    public class StepMasterActivity extends LifecycleActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_step_master);
        // setToolbar();
        SharedViewModel sharedViewModel = ViewModelProviders.of(this).get(SharedViewModel.class);
    }
}
Run Code Online (Sandbox Code Playgroud)

但我注意到LifecycleActivity与AppCompatActivity无关,而FragmentActivity也没有.

public class LifecycleActivity extends FragmentActivity implements LifecycleRegistryOwner {
    private final LifecycleRegistry mRegistry = new LifecycleRegistry(this);

    public LifecycleActivity() {
    } …
Run Code Online (Sandbox Code Playgroud)

android activity-lifecycle android-activity android-architecture-lifecycle android-architecture-components

17
推荐指数
1
解决办法
2343
查看次数

由于缺少方法而导致发布前报告失败(在com.google.android.apps.mtaas.crawler-1/base.apk中)

从最近我的应用程序开始在预发布报告中包含奇怪的错误消息(上传到Play商店后自动生成).

这些报告包含以下异常:

Exception java.lang.NoSuchMethodError: No interface method a(Landroid/arch/lifecycle/e;Landroid/arch/lifecycle/b$a;)V in class Landroid/arch/lifecycle/GenericLifecycleObserver; or its super classes (declaration of 'android.arch.lifecycle.GenericLifecycleObserver' appears in /data/app/com.google.android.apps.mtaas.crawler-1/base.apk)
android.arch.lifecycle.f$a.a (f.java:326)
android.arch.lifecycle.f.a (f.java:159)
com.firebase.ui.database.FirebaseRecyclerAdapter.<init> (FirebaseRecyclerAdapter.java:40)
Run Code Online (Sandbox Code Playgroud)

和:

Exception java.lang.NoSuchMethodError: No static method a(Landroid/app/Activity;)V in class Landroid/arch/lifecycle/ReportFragment; or its super classes (declaration of 'android.arch.lifecycle.ReportFragment' appears in /data/app/com.google.android.apps.mtaas.crawler-1/base.apk)
android.arch.lifecycle.LifecycleDispatcher$DispatcherActivityCallback.onActivityCreated (LifecycleDispatcher.java:77)
android.app.Application.dispatchActivityCreated (Application.java:219)
android.app.Activity.onCreate (Activity.java:1040)
android.support.v4.app.SupportActivity.onCreate (SupportActivity.java:66)
android.support.v4.app.FragmentActivity.onCreate (FragmentActivity.java:285)
android.support.v7.app.AppCompatActivity.onCreate (AppCompatActivity.java:84)
Run Code Online (Sandbox Code Playgroud)

和:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.arch.core.internal.SafeIterableMap.size()' on a null object reference
    at android.arch.lifecycle.LifecycleRegistry.getObserverCount(LifecycleRegistry.java:204)
    at android.arch.lifecycle.ProcessLifecycleOwner.b(ProcessLifecycleOwner.java:154)
    at …
Run Code Online (Sandbox Code Playgroud)

android firebase firebase-test-lab android-architecture-lifecycle android-architecture-components

14
推荐指数
1
解决办法
1530
查看次数

AppCompatActivity未实现LifecycleOwner

我正在使用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"
Run Code Online (Sandbox Code Playgroud)

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

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

它显示错误,this错误消息是Wrong first argument type Found: packagename.BrowseActivity, required: 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 …
Run Code Online (Sandbox Code Playgroud)

java android android-architecture-lifecycle android-architecture-components

13
推荐指数
3
解决办法
1万
查看次数

如何在后台线程上执行LiveData转换?

我需要将一个LiveData对象返回的一种数据转换为后台线程上的另一种形式,以防止UI滞后.

在我的具体案例中,我有:

  • MyDBRow对象(由原始longs和Strings 组成的POJO );
  • 一个房间 DAO实例通过一个发射这些LiveData<List<MyDBRow>>; 和
  • 一个UI期望更丰富的MyRichObject对象(PO​​JO与原语膨胀成例如日期/时间对象)

所以我需要将我LiveData<List<MyDBRow>>变成一个LiveData<List<MyRichObject>>,但不是在UI线程上.

Transformations.map(LiveData<X>, Function<X, Y>)方法需要转换,但我不能使用它,因为它在主线程上执行转换:

将主线程上的给定函数应用于sourceLiveData 发出的每个值,并返回生成结果值的LiveData.

给定的函数func将在主线程上执行.

什么是进行LiveData转换的简洁方法:

  1. 离主线程的某个地方,和
  2. 仅在需要时(即仅在某些事物正在观察预期的转变时)?

android android-thread android-room android-architecture-lifecycle android-architecture-components

13
推荐指数
3
解决办法
4455
查看次数

java.lang.IllegalStateException:没有maybeRun就不能取消调用

我正在尝试ViewModel使用Robolectric.

这是我的 ViewModel

问候视图模型.kt

@FlowPreview
@ExperimentalCoroutinesApi
class GreetingsViewModel : ViewModel() {


    private val greetingsChannel = ConflatedBroadcastChannel<String>()

    /**
     * Whenever greetingsChannel offers a value, prepend `Hello ` with it and return.
     */
    val greetingsResponse = greetingsChannel.asFlow()
        .flatMapLatest { name ->
            flowOf("Helo $name")
        }.asLiveData(viewModelScope.coroutineContext)

    /**
     * To get new greetings
     */
    fun askGreetings(name: String) {
        greetingsChannel.offer(name)
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的单元测试文件

问候ViewModelTest.kt

@FlowPreview
@ExperimentalCoroutinesApi
@RunWith(AndroidJUnit4::class)
class GreetingsViewModelTest2 {

    @Test
    fun greeting_askGreetings_getWithName() {
        val testViewModel = GreetingsViewModel()
        testViewModel.askGreetings("john")
        testViewModel.greetingsResponse.getOrAwaitValue().should.equal("Hello john")
    } …
Run Code Online (Sandbox Code Playgroud)

android robolectric android-testing android-architecture-lifecycle kotlin-coroutines

11
推荐指数
1
解决办法
803
查看次数

LiveData和LifecycleObserver之间有什么区别

我在android官方文档中阅读了有关生命周期实时数据的文档.我知道该类实现了LifeCycleObserver并使位置监听器自动关闭或打开.我也知道实时数据可以自动激活或激活.我试图使用这两种方式实现Location Observer.它工作正常,当位置更新时它显示Toast 2次.

我的问题是,如果我真的想实现像DB Connection,GPS Location,Download Image,运行后台服务这样的方式,这两种方式有什么区别.我可以使用LiveData类吗?因为我只需要实现主动和非主动功能.

LocationLiveData.java

public class LocationLiveData extends LiveData<Location> {
    private LocationManager locationManager;
    private Context context;

    public LocationLiveData(Context context) {
        this.context = context;
        locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    }

    private LocationListener locationListener = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            setValue(location);
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {

        }

        @Override
        public void onProviderEnabled(String provider) {

        }

        @Override
        public void onProviderDisabled(String provider) {

        }
    };

    @Override
    protected void …
Run Code Online (Sandbox Code Playgroud)

android android-architecture-lifecycle android-architecture-components

8
推荐指数
1
解决办法
2411
查看次数

无法在Android架构组件1.1.1中找到类DiffCallback:

最近我在gradle文件中更新了android.arch支持库版本

 // ViewModel and LiveData
    implementation "android.arch.lifecycle:extensions:1.1.1"

    // alternatively, just ViewModel
    implementation "android.arch.lifecycle:viewmodel:1.1.1"

    // alternatively, just LiveData
    implementation "android.arch.lifecycle:livedata:1.1.1"
    annotationProcessor "android.arch.lifecycle:compiler:1.1.1"

    // Room (use 1.1.0-alpha1 for latest alpha)
    implementation "android.arch.persistence.room:runtime:1.0.0"
    annotationProcessor "android.arch.persistence.room:compiler:1.0.0"

    // Paging
    implementation "android.arch.paging:runtime:1.0.0-alpha7"
Run Code Online (Sandbox Code Playgroud)

现在我声明了这个错误

在此输入图像描述

android android-gradle-plugin android-architecture-lifecycle android-architecture-components

8
推荐指数
1
解决办法
1208
查看次数

如何为android架构组件生命周期事件添加单元测试?

我尝试为支持架构组件生命周期事件的函数添加单元测试。为了支持生命周期事件,我@OnLifecycleEvent为我的函数添加了注释,我想在该事件发生时做一些事情。

一切都按预期工作,但我想为该函数创建一个单元测试,以检查我的函数在预期事件发生时运行。

 public class CarServiceProvider implements LifecycleObserver {

    public void bindToLifeCycle(LifecycleOwner lifecycleOwner) {
        lifecycleOwner.getLifecycle().addObserver(this);
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void onClear() {
       Log.i("CarServiceProvider", "onClear called");
    }
 }
Run Code Online (Sandbox Code Playgroud)

我试图模拟 LifecycleOwner 并创建新的 LifecycleRegistery 来改变生命周期观察者的状态,但我没有这样做。

如何测试onClear()状态更改时调用的函数?

android android-testing android-architecture-lifecycle android-architecture-components

8
推荐指数
3
解决办法
7009
查看次数

有没有办法使用 Android 的 LifecycleObserver 来通知 onActivityResult?

我目前LifecycleObserver用于通知诸如onStart我的观点之类的事件。这对于作为演示者或处理程序的组件非常有用,例如FacebookLoginHandler一旦视图准备好就需要注册回调。但是,在某些情况下,正如我提到的那样,我希望我的处理程序处理另一个活动的返回数据。

例子:

当我选择使用 Facebook 登录时,它会启动另一个活动,并将其返回到视图的onActivityResult方法。这让我FacebookLoginHandler在视图中注入 my ,只是将处理委托给它。我想用来LifecycleObserver获得通知onActivityResult并避免将我的处理程序耦合到视图仅用于委派此事件。有没有办法做到这一点?

android android-facebook android-architecture-lifecycle android-architecture-components

6
推荐指数
1
解决办法
1095
查看次数