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 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> ObservableField set 延迟问题 -> 正文阅读

[移动开发]ObservableField set 延迟问题

先说结论

ObservableField 一般用于 dataBinding 交互式绑定。

ObservableField.set() 从时效性来说并不等同于 TextView.setText()。

????????解决办法,如果需要实时处理观察结果 ,通过?

Choreographer.getInstance().postFrameCallback() 处理。

举个简单例子

public class TestViewModel extends ViewModel {

    public ObservableField<String> text = new ObservableField<>();

    public void setText(String s) {
        text.set(s);
    }

}
public class TestActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        View view = getLayoutInflater().inflate(R.layout.activity_test, null);
        setContentView(view);
        DataBindingUtil.bind(view);
        ActivityTestBinding binding = DataBindingUtil.getBinding(view);
        TestViewModel viewModel = new ViewModelProvider(this, new ViewModelProvider.Factory() {
            @NonNull
            @Override
            public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
                return (T) new TestViewModel();
            }
        }).get(TestViewModel.class);
        binding.setViewModel(viewModel);
        binding.btTest.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                viewModel.setText("天气真好");
                Log.e("TEST", "text: " + binding.tvTest.getText());
            }
        });
    }
}

?

查看ui,可以看到没有问题正常渲染,那么所说的延迟是体现在哪里呢。查看日志

?????????可以看到?viewModel.setText("天气真好") 之后并没有立即调用TestView.setText。通过对源码的追踪分析找到问题所在。

?对于Choreographer感兴趣的朋友可以去Android 官网看一下,?

mChoreographer.postFrameCallback的作用是 渲染下一帧时执行此回调,那么到这里就很清楚了,想要ObservableField.set 之后立马处理响应结果,可以这样写。
 binding.btTest.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                viewModel.setText("天气真好");
                Choreographer.getInstance().postFrameCallback(new Choreographer.FrameCallback() {
                    @Override
                    public void doFrame(long l) {
                        Log.e("TEST", "text: " + binding.tvTest.getText());
                    }
                });
            }
        });

下面是发现问题的业务场景 。

? ? ? ? 结合ObservableField 与dataBinding,RecyclerView绑定Adapteer,此处使用的是开源框架

BRVAH。

 ECGDataAdapter ecgDataAdapter = new ECGDataAdapter(list);
 mAdapter.set(ecgDataAdapter);
 ecgDataAdapter.setEmptyView(R.layout.iv_placeholder);
      

? ? ? ? ?查看setEmptyView()函数,此处因为?mAdapter.set(ecgDataAdapter) 并没有立即发送事件,也就是 recyclerView.setAdapter 进行绑定,导致adapter .mRecyclerView为null,所以设置EmptyView无效。

? ? ? ? ?修改为

ECGDataAdapter ecgDataAdapter = new ECGDataAdapter(list);
            mAdapter.set(ecgDataAdapter);
            Choreographer.getInstance().postFrameCallback(frameTimeNanos -> ecgDataAdapter.setEmptyView(R.layout.iv_placeholder));
        

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-05-11 16:33:45  更:2022-05-11 16:34:58 
 
开发: 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 2:04:56-

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