IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Jetpack使用异常问题集锦 -> 正文阅读

[移动开发]Jetpack使用异常问题集锦

livedata

1、问题

LiveData更新数据报错java.lang.IllegalStateException: Cannot invoke setValue on a background thread

解决方案:
setValue(T) 必须在主线程中调用 , 而 postValue(T) 既可以在主线程中调用, 也可以在子线程中调用。

viewmodel

1、在使用kotlin语言创建ViewModelFactory的时候,会抛出一下异常提示
在这里插入图片描述
解决方案:
在kotlinOptions中添加如下内容

kotlinOptions {
        jvmTarget = '1.8'
        freeCompilerArgs += [
                "-Xjvm-default=all",
        ]
    }

Hilt

在老项目中,按照官方文档加入相关依赖后,出现一下异常
官方文档
在这里插入图片描述
编译异常
在这里插入图片描述
解决方案:
1、增加下面的插件依赖

apply plugin: 'kotlin-android'

2、一定要把上面的插件依赖放在之前

//hilt
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'dagger.hilt.android.plugin'

Preferences DataStore

public class PreferenceManager {
    private RxDataStore<Preferences> dataStore;

    private PreferenceManager() {
        //配置dataStore
        dataStore = new RxPreferenceDataStoreBuilder(AppGlobalUtils.getApplication(), /*name=*/ "settings").build();
    }

    private static class HOLDER {
        private static PreferenceManager INSTANCE = new PreferenceManager();
    }

    public static PreferenceManager getInstance() {
        return HOLDER.INSTANCE;
    }

    /**
     * 保存int类型的数据
     * @param key
     * @param value
     */
    public void putInt(String key, int value) {
        dataStore.updateDataAsync(prefsIn -> {
            MutablePreferences mutablePreferences = prefsIn.toMutablePreferences();
            mutablePreferences.set(PreferencesKeys.intKey(key), value);
            return Single.just(mutablePreferences);
        });
    }

    /**
     * 获取int类型的数据
     * @param key
     * @return
     */
    public Flowable<Integer> getInt(String key) {
        Preferences.Key<Integer> EXAMPLE_COUNTER = PreferencesKeys.intKey(key);
        Flowable<Integer> exampleCounterFlow =
                dataStore.data().map(prefs -> prefs.get(EXAMPLE_COUNTER));
        return exampleCounterFlow;
    }
}

问题:
当获取数据的时候,使用Flowable.subscribe(Subscriber<? super T> s)方法,在onNext(Integer integer)没有回调该方法。

PreferenceManager.getInstance().getInt(KEY)
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Subscriber<Integer>() {
                        @Override
                        public void onSubscribe(Subscription s) {

                        }

                        @Override
                        public void onNext(Integer integer) {
                            Word word = new Word(String.valueOf(integer));
                            mWordViewModel.insert(word);
                            value++;
                        }

                        @Override
                        public void onError(Throwable t) {

                        }

                        @Override
                        public void onComplete() {

                        }
                    });

解决方式1(异步):
在onSubscribe(Subscription s) 回调中调用s.request(1)方法。
在这里插入图片描述
为什么一定要调用s.request()方法呢?结合源码注释来理解一下:
在这里插入图片描述
No events will be sent by a Publisher until demand is signaled via this method
在通过此方法发出需求信号之前,发布者不会发送任何事件。
解决方式2(异步):
调用subscribe(Consumer<? super T> onNext)

PreferenceManager.getInstance().getInt(KEY)
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Consumer<Integer>() {
                        @Override
                        public void accept(Integer integer) throws Exception {
                            Word word = new Word(String.valueOf(integer));
                            mWordViewModel.insert(word);
                            value++;
                        }
                    });

解决方式3(同步):
调用blockingFirst()

Integer integer = PreferenceManager.getInstance().getInt(KEY).blockingFirst();
Word word = new Word(String.valueOf(integer));
mWordViewModel.insert(word);
 value++;
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-07-20 19:00:48  更:2022-07-20 19:01:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 4:05:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码