我欠你的不是一句对不起 2016-09-02 10:58 采纳率: 0%
浏览 2335
已采纳

HandlerThread怎么更新ui

HandlerThread怎么更新ui,我试了很多方法,都不能更新ui,求大神们指导一下

 HandlerThread handlerThread = new HandlerThread(getMainLooper().toString());
        handlerThread.start();
        MyHandler myHandler = new MyHandler(handlerThread.getLooper());
        Message message = myHandler.obtainMessage();
        message.sendToTarget();

                public class MyHandler extends Handler {
    public MyHandler(Looper looper){
        super(looper);
    }
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
    }
} 

在handleMessage(Message msg)方法里怎么不能更新ui

  • 写回答

7条回答

  • 淡下 2016-09-02 12:08
    关注

    handler.send(Message message),或者handler.post (Runnable r);
    2.View.post(Runnable r);

    /**

    • 更新UI方法之 view.post(Runnable r)
    • @author vincentTung
    • */
      class ViewPostThread extends Thread{

      @Override 
      public void run() { 
          super.run(); 
          while(count<101){ 
              /** 
               * view.post(Runnable) 
               */ 
              bar.post(new Runnable() { 
      
                  @Override 
                  public void run() { 
                      isChanging = true; 
                      bar.setProgress(count); 
                      count++; 
      
                  }}); 
      
              /** 
               * view.postDelayed(Runnable,delayTime) 
               */ 
      

      // bar.postDelayed(new Runnable() {
      //
      // @Override
      // public void run() {
      // isChanging = true;
      // bar.setProgress(count);
      // count++;
      //
      // }},100);
      //

      try {
      Thread.sleep(100);
      } catch (InterruptedException e) {
      e.printStackTrace();
      }
      }

      } 
      

      }
      3.Activity的RunOnUIThread(Runnable r);
      class ViewPostThread extends Thread{

      @Override 
      public void run() { 
          super.run(); 
          while(count<101){ 
              runOnUiThread(new Runnable() { 
      
                  @Override 
                  public void run() { 
                      isChanging = true; 
                      bar.setProgress(count); 
                      count++; 
      
                  }}); 
      
              try { 
                  Thread.sleep(100); 
              } catch (InterruptedException e) { 
                  e.printStackTrace(); 
              } 
          } 
      
      } 
      

      }
      4.通过HandlerThread进行更新

    /**

    • 更新UI方法之
    • ---- HandlerThread
    • HandlerThread与普通Thread的区别是,普通Thread 默认不带Looper的,
    • 需要调用Looper.prepare()方法为线程分配出有一个Looper,然后通过Looper.loop()方法让Looper转起来,循环分发消息Message
    • 而HandlerThread就可以看作是默认就非配有Looper的线程Thread
    • 1.在子线程中声明Handler
    • 2.在子线程的run()方法中:Looper.prepare();//为子线程分配一个Looper
    • 3.在子线程的run()方法中:处理操作,并发送Message
    • 4.在子线程的run()方法中: Looper.loop();//让Loop转起来
    • @author vincentTung
    • */

      private HandlerThread handlerThread =new HandlerThread("handler_thread"){

      private Handler handler = new Handler(){ 
      
          public void handleMessage(android.os.Message msg) { 
              count++; 
              bar.setProgress(count); 
              if(count==100){ 
      
                  Toast.makeText(HandlerThreadTest.this, "Done", 1).show(); 
              } 
          }; 
      }; 
      

      使用时候调用
      handlerThread.start();
      5.在子线程中更新,前提是得Loop.prepare( );

    /**

    • 更新UI方法之
    • ---- 带Looper的子线程
    • 1.在子线程中声明Handler
    • 2.在子线程的run()方法中:Looper.prepare();//为子线程分配一个Looper
    • 3.在子线程的run()方法中:处理操作,并发送Message
    • 4.在子线程的run()方法中: Looper.loop();//让Loop转起来
    • @author vincentTung
    • */
      class NormalThread extends Thread{
      private int count=0;
      private Handler handler = new Handler(){
      public void handleMessage(android.os.Message msg) {
      count++;
      bar.setProgress(count);
      };};
      @Override
      public void run() {
      super.run();
      Looper.prepare();
      while(count<=100){

                  handler.sendEmptyMessage(0); 
                  try { 
                      Thread.sleep(100); 
                  } catch (InterruptedException e) { 
                      e.printStackTrace(); 
                  } 
      
              } 
              Looper.loop(); 
          } 
      

      }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

悬赏问题

  • ¥20 Python安装cvxpy库出问题
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥15 python天天向上类似问题,但没有清零
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 C#调用python代码(python带有库)
  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题