• 解决安卓UI刷新卡屏,只显示最后一处刷新的问题


    ---恢复内容开始---

    错误1

    安卓的机制决定了只有UI线程(也就是主线程)才能更新UI界面

    否则会导致UI界面混乱的问题

    这就说明了在new Thread中直接showImage是会报“出现非主线程更新界面”的错误

    错误2

    尝试在一次点击事件中多次更新UI界面    或者   妄想在死循环中一直更新UI界面,会导致UI堵塞,如下图所示

    错误3

    这里正解是通过Android的Handler机制,在Runnable 中持续跟新UI,但是想用死循环在Runnable中的run 方法里持续显示,会出现错误2的问题

    正解

    1.创建全局变量 public Handler   handler =  new Handler();

    2.在需要更新UI 界面的地方创建一个线程 

    new Thread(){

    @Override
    public void run(){//*********}

    }

    3.在run地方用handler的post方法,注意post()里应该传入一个Runnable对象,我们在创建时可以重新创建

    4.在Runnable中重写run方法,在run方法里添加showImage,点击运行,完成了在线程跟新UI界面的操作

    5.如果想持续更新UI线程,在showImage()后面添加  handler.postDelayed()方法,  方法中第一个参数传入的是Runnable对象,第二个为延时时长

    这里我的Runnable对象传入的this,就完成了持续更新界面的操作

    具体代码如下

    button_start.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View view) {
    isRunning = true;
        JNImethod(outMat1.getNativeObjAddr(),outMat2.getNativeObjAddr());
    new Thread(){
    @Override
    public void run() {
    handler.post(new Runnable() {
    @Override
    public void run()
    {

    showMatImage(outMat1, outMat2); //执行时间在4ms左右
    handler.postDelayed(this, 100);
    }
    });
    }
    }.start();
    }});

    我是在一个"开始"点击事件里添加的持续跟新UI界面的操作
    我是通过慕课网上的视频学习做成的 传送门:https://www.imooc.com/learn/267
    能力有限,有些地方表述不当,希望大家不吝赐教

    ---恢复内容结束---

  • 相关阅读:
    配置文件管理
    Nacos学习
    dockerCompose学习
    Dockerfile
    vue生命周期
    github使用
    推荐系统
    js笔记17
    js笔记16
    js笔记15
  • 原文地址:https://www.cnblogs.com/Carlsblog/p/9437962.html
Copyright © 2020-2023  润新知