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

 

  1. 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);

 

 

 

  1. handler.sendMessage();  

 

4)handler.sendEmptyMessage();  //子线程向handler发送信息

 

5)handler.removeCallback(runnable)


案例:

 

1主线程创建handler,在子线程中通过handlerpost(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,在子线程中通过handlerpost(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());
       }

    }

}
}

更多相关文章

  1. AsyncTask的用法
  2. android 多线程
  3. Android消息处理机制:源码剖析Handler、Looper,并实现图片异步加载
  4. Android(安卓)开发必读:如何成为一名优秀的Android开发者
  5. day4.16总结_消息通讯
  6. Android(安卓)Handler 异步消息处理机制 《第一行代码》
  7. [Android] [ANR的原理、分析、实战] 【转载】
  8. Android应用程序的自动更新升级(自身升级、通过tomcat) .
  9. Android异步任务AsyncTask

随机推荐

  1. Android(安卓)Studio下导出jar包和aar包
  2. 谷歌Android手机应用开发环境的搭建 转载
  3. Android开发指南-框架主题-内容提供器
  4. Android(安卓)深入解析光传感器
  5. Android(安卓)实用工具Hierarchy Viewer
  6. [Android(安卓)NDK]Android(安卓)JNI开发
  7. Android中的GPS应用开发入门教程
  8. Android基础 : Android(安卓)Service
  9. Handler和Message的使用之三
  10. Android客户端应用享用传统Web服务