该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
Android之Handler非主线程更新UI
1)Handler是Android SDK来处理异步消息的核心类。
2)子线程与主线程通过Handler来进行通信。子线程可以通过Handler来通知主线程进行UI更新
主线程:Main Thread,又叫UI线程(UI Thread)。Android应用执行的线程,所以叫主线程。负责分发事件到合适的UI窗口,也是应用和Android UI套件交互的线程。所以叫UI线程。
ANR:应用无响应(application not responding)。如果UI线程阻塞超过几秒(现在一般是5秒),用户就会看到应用无响应的Dialog。
Handler的使用1)handler.post() 更新UI
2)handler.postDelayed() 定时执行任务
//【1】首先创建一个Handler对象
Handler handler=new Handler();
//【2】然后创建一个Runnable对象
Runnable runnable=new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
//要做的事情,这里再次调用此Runnable对象,以实现每两秒实现一次的定时器操作
handler.postDelayed(this, 2000);
}
};
//【3】使用PostDelayed方法,两秒后调用此Runnable对象
handler.postDelayed(runnable, 2000);
//【4】如果想要关闭此定时器,可以这样操作
handler.removeCallbacks(runnable);
3)handler.sendMessage();
4)handler.sendEmptyMessage(); //子线程向handler发送信息
5)handler.removeCallback(runnable)
案例:
【1】主线程创建handler,在子线程中通过handler的post(Runnable)方法更新UI信息。
public class AudioActivity extends AppCompatActivity {
private boolean isChangeSeekBar=false;
private Thread thread;//线程
private MediaPlayer mediaPlayer;
private SeekBar sbProgress;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//获取上下文
mActivityContext=AudioActivity.this;
//设置布局
setContentView(R.layout.activity_audio);
//音乐进度条
sbProgress = findViewById(R.id.sb_progress);
// 创建线程对象
Thread thread = new Thread(new MuiscThread());
// 启动线程
thread.start();
}
【1】主线程创建handler,在子线程中通过handler的post(Runnable)方法更新UI信息
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
// 将SeekBar位置设置到当前播放位置
sbProgress.setProgress(msg.what);
tvCurrentime.setText(formaTime(msg.what));
}
};
//建立一个子线程的内部类实现Runnable接口
class MuiscThread implements Runnable {
@Override
public void run() {
//isChangeSeekBar判断进度条是否被点击/改变
while (mediaPlayer.isPlaying()&&isChangeSeekBar==false){
try {
// 每100毫秒更新一次位置
// 阻塞main线程,休眠1000毫秒
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
//子线程向handler发出的信息通知更新UI
handler.sendEmptyMessage(mediaPlayer.getCurrentPosition());
}
}
}
}