解决安卓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
能力有限,有些地方表述不当,希望大家不吝赐教

 

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

posted @ 2018-08-07 16:50  浮躁世界中的一股清流  阅读(1098)  评论(0编辑  收藏  举报