实时更新UI

来源:互联网 发布:java分层命名规范 编辑:程序博客网 时间:2024/06/07 18:02

众所周知,Android子线程无法修改UI界面,但是一些耗时操作又必须放到子线程中进行,所以有一个概念叫做“异步更新UI”,什么意思呢?

耗时操作放在子线程去做,当耗时操作做完之后我把结果传给主线程,然后让主线程修改UI界面

关于如何进行异步更新,下面这篇博客写的很详细也很好

android进行异步更新UI的四种方式

在我们项目中,有时候会遇到这种需求:异步实时更新UI

异步更新:  一般是指开线程处理耗时操作然后返回的结果交给主线程修改UI界面,UI界面只变化一次异步实时更新:不停地执行异步更新操作,UI也在不停地变化,因为要实时更新数据

举个“栗子”

1 歌曲显示当前播放时间,随着音频播放时刻变化,显示时间一直在变化2 天气预报,更新每小时或者每一分钟的状态

如图所示

这里写图片描述

handler是进行异步操作的核心类,我们在项目中一般是用sendMessage或者post方法来执行异步更新(post是sendMessage的变种),使用post更加简单且方便

public class MainActivity extends AppCompatActivity {    TextView tv;    int i;    private Handler handler=new Handler();    private Runnable r=new Runnable() {        @Override        public void run() {            i++;            updateUI(i+"");            if(i<10){                handler.postDelayed(r, 1000);//1.1            }else {                handler.removeCallbacks(r);//1.2            }        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        tv = (TextView) findViewById(R.id.fram);        handler.postDelayed(r, 1000);//1.3    }    private void updateUI(String str) {        tv.setText(str);    }}

handler.postDelayed是指延时一段时间再执行回调r,而r中又要执行postDelayed,其实这就是一个递归,不停地调用自身,直至达到条件限制(i<10)然后执行完毕

1.2 这一行表示移除回调r,移除之后就不再继续执行回调了1.1和1.3里面的1000表示延时的时间,单位是毫秒,二者的延时时间可以不一样,1.3延时表示从原有的UI到第一次更新UI的间隔时间,1.1延时表示的是每次更新UI间隔的时间,1.3最好不要设置成0,因为设置成0的话就不能看到原始的UI,感受不到UI界面的更新了。

关于Runnable

这里写图片描述

The Runnable interface should be implemented by any class whose instances are intended to be executed by a thread. 

这是一个只有一个run方法的接口,任何想通过线程执行实例化的类都必须实现这个接口