您的位置:首页 > 移动开发 > Android开发

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”);
}});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: