android多线程handler+runOnUithread+view.post+handler.post

 下面说说android的多线程机制,讲到多线程,就可以说道android有名的ANR(Application Not Responding)既应用程序未响应,触发ANR的条件大致有两个:1、在activity中超过5秒的时间未能响应下一个事件。2、BroadcastReceive超过10秒,这两个条件都会触发ANR。

   下面模拟一个activity的ANR

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
protected  void  onCreate(Bundle savedInstanceState)
     {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         findViewById(R.id.button1).setOnClickListener( new  OnClickListener()
         {
             @Override
             public  void  onClick(View v)
             {
                 try
                 {
                     Thread.sleep( 10000 );
                 }
                 catch  (InterruptedException e)
                 {
                     e.printStackTrace();
                 }
             }
         });
     }

   运行效果:

               未触发:

                         触发后:


当用户使用时 出现这样的体验,可想而知会很蛋疼的。。。

有人就会问 为什么会有ANR这样的机制。

其实android系统中所有的UI显示都是在main线程中执行的,如果线程中有耗时操作时,线程中的其他UI组件就会等耗时结束时才能开始响应,所以为了避免这样的情况,android用handler将耗时操作放到子线程中执行,当结束时,将耗时操作的结果发回给主线程,所以这里又要引入线程间通信的概念


额(⊙o⊙)… 到这里感觉 新概念越写越多了。。。。  没事 慢慢解决么。。。

这么说感觉线程间通讯 很蛋疼 其实 也就调用一个方法而已。。。。

嘿嘿


不多说了 看代码先

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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
private  Handler mHandler =  new  Handler()
{
     //参数:Message相当于一种信息的载体,可以将子线程的数据传到主线程中,也就是所谓的线程间通信了。。。
     public  void  handleMessage(android.os.Message msg)
     { //该方法在主线程中执行,不信的话可以log的。。。
         String  result = ( String ) msg.obj; //从主线程传来的数据   
         switch  (msg.what) //what用于标记谁传来的信息
         {
         case  1 :
             mTextView1.setText(result); //做UI组件的设置必须在主线程否则会报错的。。。
             break ;
         case  2 :
             mTextView2.setText(result);
             break ;
         default :
             break ;
         }
     }
};
private  TextView mTextView1;
private  TextView mTextView2;
@Override
protected  void  onCreate(Bundle savedInstanceState)
{
     super .onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);
     mTextView1 = (TextView) findViewById(R.id.textView1);
     mTextView2 = (TextView) findViewById(R.id.textView2);
     Button button1 = (Button) findViewById(R.id.button1);
     button1.setOnClickListener(listener);
     Button button2 = (Button) findViewById(R.id.button2);
     button2.setOnClickListener(listener);               
}
private  OnClickListener listener =  new  OnClickListener()
     {
         @Override
         public  void  onClick(View v)
         {
             switch  (v.getId())
             {
             case  R.id.button1:
                 new  Thread()
                 {
                     public  void  run()
                     {
                         // 模拟耗时操作
                         try
                         {
                             Thread.sleep( 1000 );
                         }
                         catch  (InterruptedException e)
                         {
                             e.printStackTrace();
                         }
                         String  result =  "从网络获取的结果" ;
                         Message msg =  new  Message();
                         msg.what =  1 ;
                         msg.obj = result;
                         // 发送到main线程
                         mHandler.sendMessage(msg);
                         // textView.setText(result);
                     }
                 }.start();
                 Log.e( "MainActivity" "button1" );
                 break ;
             case  R.id.button2:
                 new  Thread()
                 {
                     public  void  run() {
                         // 模拟耗时操作
                         try
                         {
                             Thread.sleep( 1000 );
                         }
                         catch  (InterruptedException e)
                         {
                             e.printStackTrace();
                         }
                         String  result =  "从数据库获取的结果" ;
                         Message msg =  new  Message();
                         msg.what =  2 ;
                         msg.obj = result;
                         // 发送到main线程
                         mHandler.sendMessage(msg);
                     }
                 }.start();
                 Log.e( "MainActivity" "button2" );
                 break ;
             default :
                 break ;
             }
         }
     };

我会把源代码 附加到文章的 布局文件 就不写了,占地方。。。

运行结果:


handler 差不多就这些了。。。代码的项目超过2mb 了 我放到51cto的网盘里了

链接:handler



下面讲讲 post,其实view.post和handle.post这两个方法差不多,都是在post方法中传入一个实现了Runnable接口的对象,在这个对象的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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
private  TextView mTextView;
     private  Button mButton;
     class  Listener  implements  OnClickListener
     {
         @Override
         public  void  onClick(View v)
         {
             switch  (v.getId())
             {
             case  R.id.button1:
                 download();
                 break ;
             default :
                 break ;
             }
         }
     }
     @Override
     protected  void  onCreate(Bundle savedInstanceState)
     {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         mButton = (Button) findViewById(R.id.button1);
         mButton.setOnClickListener( new  Listener());
     }
     public  void  download()
     {
         new  PlayThread().start(); //开启子线程
     }
     class  PlayThread  extends  Thread
     {
         @Override
         public  void  run()
         { // 这是子线程
             try
             {
                 Thread.sleep( 2000 ); //模拟从网络下载数据的耗时操作
             }
             catch  (InterruptedException e)
             {
                 e.printStackTrace();
             }
                                                                                                                                                                                         
             mButton.post( new  Runnable() //这里用的是view的post方法
             { //这里的内容将在主线程中显示
                 @Override
                 public  void  run()
                 {
                     mTextView.setText( "yes 获取到数据了~~~" );
                 }
             });
         }
     }


runOnUiThread(Runnable action)方法和handler.post(Runnable action)方法,这两个方法的用法跟view.post(Runnable action)方法的用法一样

runOnUiThread(Runnable action)是activity的方法,这里的Runnable同样是运行在主线程中的

handler.post(Runnable action)是handler中的方法,大同小异,当然如果大家能告诉我这之间的区别我也会洗耳恭听的,相互学习么,谢谢啦。。。

android多线程handler+runOnUithread+view.post+handler.post
2013-

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值