【问题标题】:how to assign variable value in an anonymous class java如何在匿名类java中分配变量值
【发布时间】:2018-03-31 09:44:14
【问题描述】:

我想为我的列表变量分配一个结果值,但是 lambda 中的一个变量必须是最终的,如果它是最终的,它就无法接收值。

public List<PersonalInfo> getAllPatient() {

    List<PersonalInfo> mPersonalInfoList;
    AppDatabase db = AppDatabase.getAppDatabase(mContext);
    db.patientDao().getAll()
            .flatMapIterable(patientlist -> {
                    List<PersonalInfo> personalInfoList = new ArrayList<>();
                    for (PersonalInfo p: patientlist) {
                        p.setColor(getRandomMaterialColor("400"));
                        personalInfoList.add(p);
                    }
                    return  personalInfoList;
            })
            .toList()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(result ->
               // error
                mPersonalInfoList =result
             );
    return mPersonalInfoList;
}

【问题讨论】:

  • 这需要阻塞调用getAllPatient的线程。你为什么要这个?你不能只返回Single&lt;List&lt;PersonalInfo&gt;&gt; 并让代码处理subscribe(list -&gt; ...) 中的列表吗?

标签: java android rx-java android-room


【解决方案1】:

问题在于您的方法在将值分配给变量之前返回。你可以用锁来解决这个问题。

试试这个:

public List<PersonalInfo> getAllPatient() {
    final List<PersonalInfo> mPersonalInfoList = new ArrayList<>();
    AppDatabase db = AppDatabase.getAppDatabase(mContext);
    db.patientDao().getAll()
            .flatMapIterable(patientlist -> {
                    List<PersonalInfo> personalInfoList = new ArrayList<>();
                    for (PersonalInfo p : patientlist) {
                        p.setColor(getRandomMaterialColor("400"));
                        personalInfoList.add(p);
                    }
                    return  personalInfoList;
            })
            .toList()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(result -> {
                synchronized (mPersonalInfoList) {
                    mPersonalInfoList.addAll(result);
                    mPersonalInfoList.notifyAll();
                }
              }
            );

    synchronized (mPersonalInfoList) {
            try {
                mPersonalInfoList.wait();
            } catch (InterrupedException ex) {
                ex.printStackTrace();
            }
    }

    return mPersonalInfoList;
}

【讨论】:

  • 这导致应用 UI 冻结
  • 这可能是因为传递给 subscribe 的 lambda 表达式从未被调用。
【解决方案2】:

您可以将局部变量转换为类成员,它应该可以解决您的问题。

【讨论】:

    【解决方案3】:

    好吧,在您的情况下,您可以初始化 mPersonalInfoList,而不是分配您的结果,而是将其添加到 mPersonalInfoList。

    所以:

    final List<PersonalInfo> mPersonalInfoList = new ArrayList<>();
    
    ...
    
    .subscribe(result ->
        mPersonalInfoList.addAll(result);
    );
    

    【讨论】:

    • 这将返回一个空列表。
    • List 从内部类中取出一个空值
    猜你喜欢
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多