Android 如何用子线程更新UI
2019-08-16 17:26
1306 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44569845/article/details/90615408
线程定义参考本人JAVA单线程与多线程
在这里直接分析Android 如何通过子线程更新UI的问题
在学习该篇内容以前,需要牢记一句话,这句话将会是本文的核心问题:
UI界面只能由该UI的主线程来进行访问(更新),这也是单独拿出一篇文章来讲Android UI及线程的原因。
1. Handler机制
Android线程之间信息的传递是通过Handler来实现的,Handler一般写在主线程中,Handler的作用就是传递和处理消息(Message),实例化并且重写函数的方法如下:
final Handler mHandler = new Handler() { @Override //重写handleMessage方法 public void handleMessage(Message msg) { super.handleMessage(msg); Bundle b = msg.getData();// 获取数据包 int age = b.getInt("age"); //获取数据包中的age值 testedit.setText("UI操作方法3"+age);//设置文本内容 } };
通过计时器持续对线程进行操作
new Timer().schedule(new TimerTask() { @Override public void run() { //通过obtain获取message对象,不建议使用new实例化 Message msg = myHandler.obtainMessage(); //message对象第一种传递参数的方法 //新建一个数据包 Bundle b = new Bundle(); //放入int型的值 b.putInt("age", index++); msg.setData(b); //message对象第二种传递参数的方法 //msg.arg1=1; myHandler.sendMessage(msg); } }, 0,1000);
以上便是子线程更新UI的最基本的方法
2.SurfaceView界面
除此之外,我们还可以通过实例化SurfaceView创建界面,SurfaceView通常是用作预览界面,游戏界面等,操作它非常方便,最重要的是SurfaceView支持直接通过子线程更新UI。
#声明为属性 Thread thread; SurfaceView surfaceview;
//获取SurfaceView对象 surfaceview = findViewById(R.id.surfaceview); //获取控制器,添加回调方法 videoview.getHolder().addCallback(new SurfaceHolder.Callback() { //创建surfaceview时需要完成的事 @Override public void surfaceCreated(SurfaceHolder surfaceHolder) { thread.start(); } @Override public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) { } //离开或者销毁surfaceview时需要做的事 @Override public void surfaceDestroyed(SurfaceHolder surfaceHolder) { thread.interrupt(); } }); } thread = new Thread(){ public void run(){ while(!interrupted()){ Canvas c = surfaceview.getHolder().lockCanvas();//获取画布对象 Paint paint = new Paint(); c.drawText("test",100,100,paint); surfaceview.getHolder().unlockCanvasAndPost(c);//提交 } } }
3.为了优化代码,有时我们还可以采用简化的方法(不推荐使用以下方法)
//runOnUiThread是Activity的方法 runOnUiThread(new Runnable() { @Override public void run() { // 更新UI的操作 } });
//调用view的post方法 myView.post(new Runnable() { @Override public void run() { // 更新UI myView.setText(“更新UI”); }});
相关文章推荐
- android-如何在子线程中更新ui
- Mono for android 如何动态添加View,线程内部如何更新UI.
- android如何在子线程中更新UI
- 在android中如何用线程来更新UI
- Android中如何在子线程更新UI
- android子线程更新UI,与主Thread一起工作
- Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask等
- Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask等
- 子线程更新UI会发生android.view.ViewRoot$CalledFromWrongThreadException异常的解决方法
- Android中利用线程更新UI(转)
- Android 在其他线程中更新UI 线程
- Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask等
- Android线程模型解析(包括UI的更新)
- Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask等!!!!!!!!!!
- Android中后台线程如何与UI线程交互
- Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask等
- (转)Android中更新UI的线程:Thread 、Handler、Looper、TimerTask等
- Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask等
- Android在子线程中更新Activity中UI的方法
- Android线程模型解析(包括UI的更新)