当前位置: 移动技术网 > 移动技术>移动开发>Android > 实例讲解Android多线程应用开发中Handler的使用

实例讲解Android多线程应用开发中Handler的使用

2019年07月24日  | 移动技术网移动技术  | 我要评论

其实可以理解handler为主线程和另外的线程之间进行数据更新的东东,并且handler在主线程中,并在handler直接调用线程的run方法

package com.handler02; 
 
import android.app.activity; 
import android.os.bundle; 
import android.os.handler; 
 
public class handler02activity extends activity { 
  /** called when the activity is first created. */ 
  private handler handler=new handler(); 
  @override 
  public void oncreate(bundle savedinstancestate) { 
    super.oncreate(savedinstancestate); 
    handler.post(thread1); 
    setcontentview(r.layout.main); 
    
    system.out.println("================main==============="+thread.currentthread().getid()); 
    system.out.println("============main========="+thread.currentthread().getname()); 
  } 
  runnable thread1=new runnable() { 
     
    @override 
    public void run() { 
      system.out.println("======thread1==============="+thread.currentthread().getid()); 
      system.out.println("========thread1============"+thread.currentthread().getname()); 
      try { 
        thread.sleep(10000); 
      } catch (exception e) { 
        // todo: handle exception 
      } 
       
    } 
  }; 
} 

结果是主线程等待10s后才显示出来,并且线程id

package com.handler4; 
 
import android.app.activity; 
import android.os.bundle; 
import android.os.handler; 
import android.os.message; 
import android.view.view; 
import android.widget.textview; 
 
public class handler4activity extends activity { 
  /** called when the activity is first created. */ 
  private textview textview; 
  private myhandler myhandler=new myhandler(); 
  @override 
  public void oncreate(bundle savedinstancestate) { 
    super.oncreate(savedinstancestate); 
    setcontentview(r.layout.main); 
    textview=(textview)this.findviewbyid(r.id.textview1); 
  } 
  class myhandler extends handler{ 
    //从消息队列中取出并handlemessage处理消息 
    @override 
    public void handlemessage(message msg) { 
      textview.settext((string)msg.obj); 
    } 
  } 
  public void download(view view){ 
    thread thread=new thread(new runnable() { 
       
      @override 
      public void run() { 
        try { 
          string s="zhangzhao"; 
          thread.sleep(5000); 
          //数据发送出来 
          //textview.settext(s); 
          message message=message.obtain();//最好不要new,这个obtain会节省资源 
          message.obj=s; 
          myhandler.sendmessage(message);//没有指定looper那么就会发送给主线程中的looper 
           
        } catch (interruptedexception e) { 
          // todo auto-generated catch block 
          e.printstacktrace(); 
        } 
         
      } 
       
    }); 
    thread.start();//会出错原因是在非ui线程里面直接操作ui 
    //主线程维护了一个消息对列,当其他的线程有数据需要传递给主线程的时候,你就把数据封装成一个message对象,然后放在主线程的 
    //消息队列中去,对应消息的处理由looper,子线程通过handler把下载完的数据封装到message里面,然后把消息取出来交给handler进行处理 
    //通过handle和message实现两个线程之间达到共享数据 
  } 
} 

package com.handler5; 
 
import android.app.activity; 
import android.os.bundle; 
import android.os.handler; 
import android.os.message; 
import android.view.view; 
import android.widget.button; 
import android.widget.progressbar; 
import android.widget.textview; 
 
public class handler5activity extends activity { 
  /** called when the activity is first created. */ 
  private progressbar progressbar; 
  private button button; 
  private textview textview; 
  private myhandler myhandler=new myhandler(); 
  int i=0; 
  @override 
  public void oncreate(bundle savedinstancestate) { 
    super.oncreate(savedinstancestate); 
   
    setcontentview(r.layout.main); 
    progressbar = (progressbar)this.findviewbyid(r.id.progressbar1); 
    textview=(textview)this.findviewbyid(r.id.textview1); 
  } 
  class myhandler extends handler{ 
    @override 
    public void handlemessage(message msg) { 
      int pos =(integer)msg.obj; 
      progressbar.setprogress(pos); 
      textview.settext(pos+"%"); 
       
    } 
  } 
  public void download(view view){ 
      
    new thread(new runnable() { 
       
      @override 
      public void run() { 
        while(i<=100){ 
          try { 
            thread.sleep(300); 
            i+=10; 
            message message=message.obtain(); 
            message.obj=i; 
            myhandler.sendmessage(message); 
          } catch (interruptedexception e) { 
            // todo auto-generated catch block 
            e.printstacktrace(); 
          } 
         
        } 
         
      } 
    }).start(); 
  } 
} 

效果:

2016131175347004.jpg (283×189)

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网