【问题标题】:Transformations.map() returns null valuesTransformations.map() 返回空值
【发布时间】:2020-11-08 02:43:26
【问题描述】:

我正在编写一个程序,其中有两个 LiveData 对象,如图所示:


    public LiveData<placeImages> chosenImages;
    public LiveData<List<Bitmap>> chosenBitmaps= Transformations.map(chosenImages, (placeimags) ->
    {
        ArrayList<Bitmap> bitmaps=new ArrayList<Bitmap>();
        for(PhotoI photoI:placeimags.images)
        {
            try {
                Bitmap b=getThumbnail(app.getContentResolver(),photoI.imageURI);
                if(b!=null) {
                    bitmaps.add(b);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return bitmaps;
    });

问题是每当我观察 chosenImages LiveData 它工作正常,但当我观察 chosenBitmaps LiveData 它返回以下错误:

2020-07-18 17:40:39.790 32164-32164/com.nisarg.locsav E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.nisarg.locsav, PID: 32164
    java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.lifecycle.LiveData.observeForever(androidx.lifecycle.Observer)' on a null object reference
        at androidx.lifecycle.MediatorLiveData$Source.plug(MediatorLiveData.java:141)
        at androidx.lifecycle.MediatorLiveData.onActive(MediatorLiveData.java:118)
        at androidx.lifecycle.LiveData$ObserverWrapper.activeStateChanged(LiveData.java:437)
        at androidx.lifecycle.LiveData$LifecycleBoundObserver.onStateChanged(LiveData.java:395)
        at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.java:361)
        at androidx.lifecycle.LifecycleRegistry.forwardPass(LifecycleRegistry.java:300)
        at androidx.lifecycle.LifecycleRegistry.sync(LifecycleRegistry.java:339)
        at androidx.lifecycle.LifecycleRegistry.moveToState(LifecycleRegistry.java:145)
        at androidx.lifecycle.LifecycleRegistry.handleLifecycleEvent(LifecycleRegistry.java:131)
        at androidx.fragment.app.FragmentViewLifecycleOwner.handleLifecycleEvent(FragmentViewLifecycleOwner.java:51)
        at androidx.fragment.app.Fragment.performStart(Fragment.java:2737)
        at androidx.fragment.app.FragmentStateManager.start(FragmentStateManager.java:365)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1194)
        at androidx.fragment.app.FragmentManager.addAddedFragments(FragmentManager.java:2224)
        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1997)
        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1953)
        at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1849)
        at androidx.fragment.app.FragmentManager$4.run(FragmentManager.java:413)
        at android.os.Handler.handleCallback(Handler.java:794)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:176)
        at android.app.ActivityThread.main(ActivityThread.java:6635)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)

我认为 Transformations.map() 正在返回空值。我之前在一个项目中做过类似的事情,当我使用 Transformations.map() 时也发生了同样的事情。有谁知道为什么会这样?

【问题讨论】:

  • 你的chosenImages在你调用Transformations.map时没有初始化,所以当你观察它时它会不正确地尝试附加到null
  • @Pawel 我该怎么做才能解决这个问题?
  • @Pawel 我有同样的问题,但在我的情况下,我确实初始化了引用的LiveData(Kotlin 代码:private val userDocument = MutableLiveData&lt;DocumentSnapshot?&gt;() val userData = Transformations.map(userDocument) { it?.toObject(UserModel::class.java) })。有什么想法吗?

标签: android android-livedata mediatorlivedata android-livedata-transformations


【解决方案1】:

改变 public LiveData&lt;placeImages&gt; chosenImages;

public LiveData&lt;placeImages&gt; chosenImages = MutableLiveData()

【讨论】:

  • 我有同样的问题,但在我的情况下,我确实初始化了引用的LiveData(Kotlin 代码:private val userDocument = MutableLiveData&lt;DocumentSnapshot?&gt;() val userData = Transformations.map(userDocument) { it?.toObject(UserModel::class.java) })。有什么想法吗?
【解决方案2】:

大概在chosenImages后面某处有一个MutableLiveData

MutableLiveData 未使用noargs 构造函数new MutableLiveData&lt;placeImages&gt;() 初始化时,您所描述的会发生,而Transformations.map() 派生的LiveData 也未初始化,因此null

解决方案是在创建时初始化MutableLiveData,即使它被初始化为null:new MutableLiveData&lt;placeImages&gt;(null),这样派生的也会被初始化。

【讨论】:

  • 另外值得补充的是,您需要“观察”您的 Transformations.map()'d LiveData 以便它注册一个值,这是我在单元测试中发现的,我刚刚检查了 LiveData 的 .getValue ()
猜你喜欢
  • 1970-01-01
  • 2021-07-07
  • 1970-01-01
  • 2021-12-21
  • 2015-11-07
  • 2020-05-20
  • 2013-10-09
  • 2012-09-25
  • 2012-03-29
相关资源
最近更新 更多