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

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

    }

了解下Android的Handler机制,你就知道怎么更新ui了。

你的handler绑定的是你自己的handlerthread而不是ui线程。mhandler = new Handler(Looper.getMainLoop())即可

最简单都更新UI的方式
1.先开个子线程做耗时的操作
new Thread(new Runnable() {

        @Override
        public void run() {
            //子线程里面做可以一些耗时的操作
            for (int i = 0; i < 100; i++) {
                String arr = "你好"+i;
            }
            //更新UI
            runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    //这里可以直接更新UI了。方便

                }
            });
        }
    }).start();

其实说白了,最终还是通过Handler去更新UI界面

了解下原理就明白了:http://www.cnblogs.com/menlsh/archive/2013/06/07/3125341.html

看看是不是在主线程,因为这要在主线程创建才有效。