众所周知,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方法的接口,任何想通过线程执行实例化的类都必须实现这个接口