android handler更新ui,Android之Handler非主线程更新UI

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

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());

}

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值