您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
48_通过handler和message在子线程里面去更新UI
发布时间:2021-02-28 11:43:29编辑:雪饮阅读()
上次完成了多线程断点续传的移植到安卓端,但是主要是实现了逻辑移植,实际上对应ui,比如进度条等还没有进行渲染更新。
那么这次也先不急着去渲染更新,这次先来了解下如何去更新安卓界面中的ui。
在安卓中对于界面ui更新是要主线程去完成的,比如说我要做一个每两秒就去更新下ui界面的功能,就简单的更新下textview的内容即可。
那么要实现每两秒就更新下ui,则就创建一个线程,在该线程中每次sleep 2000毫秒这样进行循环,假比如这里要循环100次,那么就是在该线程(相对于主线程 ui界面 oncreate所在线程来说其就是子线程了)中将这sleep 2000进行循环100次,比如每次sleep 2000前设置下当前值,假如循环计数变量为i,则setText为i即可。
一般情况下,这也是我们正常人的思维方式,理论是没有错误的。但是实际上在安卓中为了避免各个线程都去操作ui,导致主线程ui不好显示处理,所以要求ui更新必须是主线程。
则安卓提供了一个类似消息队列的东西,子线程要想更新ui,则可以给主线程发消息,主线程通过一个不断”轮询”查看消息的功能来处理每个消息。
那么具体的理论都ok了。接下来就看具体的实现了。
大概布局下activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Hello World!"
android:id="@+id/hello" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="tv"
android:id="@+id/tv" />
</LinearLayout>
MainActivity.java的具体实现:
package com.example.test;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private TextView tv;
//1 .创建出来handler 要求必须在主线程里面创建
private Handler handler = new Handler(){
// 主线程处理消息 调用的方法
@Override
public void handleMessage(Message msg) {
int count = (Integer) msg.obj;
tv.setText("当前条目为 "+ count);
super.handleMessage(msg);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView hello=this.findViewById(R.id.hello);
hello.setText("我是主线程,我的线程名是:"+Thread.currentThread().getName());
tv = (TextView) this.findViewById(R.id.tv);
updateTv();
}
public void updateTv(){
//每隔2秒钟更新一下 tv的内容
new Thread(){
@Override
public void run() {
for(int i = 0;i<100;i++){
try {
sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Message msg = new Message();
msg.obj = i;
handler.sendMessage(msg);
}
super.run();
}
}.start();
}
}
部署到设备中进行测试,我这里因为停留了好久,所以会看到最后渲染到99了。
关键字词:android,更新UI
上一篇:47_多线程断点续传移植