服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - 实例讲解Android多线程应用开发中Handler的使用

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

2021-05-21 13:50张钊 Android

这篇文章主要介绍了Android多线程应用开发中Handler的使用,Handle主要被用来更新UI和处理消息,需要的朋友可以参考下

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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实现两个线程之间达到共享数据
  }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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();
  }
}

效果:

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

延伸 · 阅读

精彩推荐
  • AndroidAndroid中AsyncTask详细介绍

    Android中AsyncTask详细介绍

    这篇文章主要介绍了Android中AsyncTask详细介绍,AsyncTask是一个很常用的API,尤其异步处理数据并将数据应用到视图的操作场合,需要的朋友可以参考下...

    Android开发网7452021-03-11
  • AndroidAndroid编程解析XML方法详解(SAX,DOM与PULL)

    Android编程解析XML方法详解(SAX,DOM与PULL)

    这篇文章主要介绍了Android编程解析XML方法,结合实例形式详细分析了Android解析XML文件的常用方法与相关实现技巧,需要的朋友可以参考下...

    liuhe68810052021-05-03
  • AndroidAndroid实现Service获取当前位置(GPS+基站)的方法

    Android实现Service获取当前位置(GPS+基站)的方法

    这篇文章主要介绍了Android实现Service获取当前位置(GPS+基站)的方法,较为详细的分析了Service基于GPS位置的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    Ruthless8342021-03-31
  • AndroidAndroid界面效果UI开发资料汇总(附资料包)

    Android界面效果UI开发资料汇总(附资料包)

    android ui界面设计,友好的界面会提高用户体验度;同时也增强了android ui界面设计的难度,本文提供了一些常用开发资料(有下载哦)感兴趣的朋友可以了解下...

    Android开发网4672021-01-03
  • AndroidAndroid实现固定屏幕显示的方法

    Android实现固定屏幕显示的方法

    这篇文章主要介绍了Android实现固定屏幕显示的方法,实例分析了Android屏幕固定显示所涉及的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    鉴客6192021-03-27
  • AndroidAndroid程序设计之AIDL实例详解

    Android程序设计之AIDL实例详解

    这篇文章主要介绍了Android程序设计的AIDL,以一个完整实例的形式较为详细的讲述了AIDL的原理及实现方法,需要的朋友可以参考下...

    Android开发网4642021-03-09
  • Android汇总Android视频录制中常见问题

    汇总Android视频录制中常见问题

    这篇文章主要汇总了Android视频录制中常见问题,帮助大家更好地解决Android视频录制中常见的问题,需要的朋友可以参考下...

    yh_thu5192021-04-28
  • AndroidAndroid CardView+ViewPager实现ViewPager翻页动画的方法

    Android CardView+ViewPager实现ViewPager翻页动画的方法

    本篇文章主要介绍了Android CardView+ViewPager实现ViewPager翻页动画的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    Abby代黎明9602022-03-02