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

其实可以理解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();
  }
}

效果:

(0)

相关推荐

  • Android多线程处理机制中的Handler使用介绍

    接下来让我介绍Android的Handler的使用方法.Handler可以发送Messsage和Runnable对象到与其相关联的线程的消息队列.每个Handler对象与创建它的线程相关联,并且每个Handler对象只能与一个线程相关联. Handler一般有两种用途:1)执行计划任务,你可以再预定的实现执行某些任务,可以模拟定时器.2)线程间通信.在Android的应用启动时,会创建一个主线程,主线程会创建一个消息队列来处理各种消息.当你创建子线程时,你可以再你的子线程中拿到父线程中创建的Ha

  • Handler与Android多线程详解

    下面是一段大家都比较熟悉的代码: 复制代码 代码如下: Handler handler = new Handler(); handler.post(myThread); //使用匿名内部类创建一个线程myThreadRunnable mythread = new Runnable() {public void run() {}}; 一开始,相信很多人都以为myThread中的run()方法会在一个新的线程中运行,但事实并非如此. 上述代码中的handler并没有调用线程myThread的star

  • Android编程实现使用handler在子线程中更新UI示例

    本文实例讲述了Android编程实现使用handler在子线程中更新UI.分享给大家供大家参考,具体如下: MainActivity代码: package com.example.ui; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextV

  • Android Handler多线程详解

    Android--多线程之Handler 前言 Android的消息传递机制是另外一种形式的"事件处理",这种机制主要是为了解决Android应用中多线程的问题,在Android中不 允许Activity新启动的线程访问该Activity里的UI组件,这样会导致新启动的线程无法改变UI组件的属性值.但实际开发中,很多地方需要在 工作线程中改变UI组件的属性值,比如下载网络图片.动画等等.本篇博客主要介绍Handler是如何发送与处理线程上传递来的消息,并讲解 Message的几种传递数

  • Android App在线程中创建handler的方法讲解

    相关概念 1.Handler:可以看做是一个工具类,用来向消息队列中插入消息的; 2.Thread:所有与Handler相关的功能都是与Thread密不可分的,Handler会与创建时所在的线程绑定; 3.Message:消息; 4.MessageQueue:消息队列,对消息进行管理,实现了一个Message链表; 5.Looper:消息循环,从MessageQueue中取出Message进行处理: 6.HandlerThread:继承Thread,实例化时自动创建Looper对象,实现一个消息

  • Android中的Handler与多线程应用实例

    本文首先解释一下handler是用来干嘛的,然后通过例子介绍其在多线程中的应用. 什么是Handler handler通俗一点讲就是用来在各个进程之间发送数据的处理对象.在任何进程中,只要获得了另一个进程的handler则可以通过handler.sendMessage(message)方法向那个进程发送数据.基于这个机制,我们在处理多线程的时候可以新建一个thread,这个thread拥有UI线程中的一个handler.当thread处理完一些耗时的操作后通过传递过来的handler像ui线程发

  • Android Handler主线程和一般线程通信的应用分析

    Handler的定义:主要接受子线程发送的数据, 并用此数据配合主线程更新UI.解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发, 比如说, 你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操作.如果此时需要一个耗时的操作,例如: 联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,会

  • android使用handler ui线程和子线程通讯更新ui示例

    复制代码 代码如下: package com.act262.sockettx; import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import and

  • 深入Android Handler与线程间通信ITC的详解

    在<Android Handler之消息循环的深入解析>中谈到了Handler是用于操作线程内部的消息队列,所以Handler可以用来线程间通信ITC,这种方式更加安全和高效,可以大大减少同步的烦恼,甚至都可以不用syncrhonized.线程间通讯ITC正常情况下函数调用栈都会生存在同一个线程内,想要把执行逻辑交换到其他线程可以新建一个Thread,然后start().另外一种方法就是用ITC,也即用消息队列来实现,线程需要把执行逻辑交到其他线程时就向另外的线程的消息队列发送一个消息,发送消

  • android使用handlerthread创建线程示例

    在android开发中,一说起线程的使用,很多人马上想到new Thread(){...}.start()这种方式.这样使用当然可以,但是多次使用这种方式,会创建多个匿名线程.使得程序运行起来越来越慢.因此,可以考虑使用一个Handler来启动一个线程,当该线程不再使用就删除,保证线程不会重复创建.一般会使用Handler handler = new Handler(){...}创建Handler.这样创建的handler是在主线程即UI线程下的Handler,即这个Handler是与UI线程下

随机推荐