文档章节

android中Handler的初步认识(四)

tiansl
 tiansl
发布于 2015/01/21 15:43
字数 772
阅读 8
收藏 0

 等了一晚上也没有人回答,我自已就重新看了一遍代码,发现我的思路是有问题的。 

   我在第二篇的代码中,是这样实现循环的

       我在主线程的run方法中调用handler.sendMessage(msg)

              而在handlersendMessage中使用  post方法将run放置在消息队列中

       这样相互调用形成了一个循环

       然后使用handlerremoveCallbacksrun从消息队列中去除,从而中断跳出循环

       这样整个循环是在主线程的message queue中形成的。


   而我在第三篇中,想要用新建的线程来实现计数的时候,仍然按照上面的思路来写,就有个问题:当我在主线程中使用handlerpost方法时,实际上是将新建线程中的run方法在主线程执行(放到主线程的message  queue

这样其实整个过程还是在主线程中运行的

 

    经过一夜的思索,我突然意识到,我其实是要在新建的线程中实现计数的功能,那就应该让循环在新建的线程中实现

 

   于是我把代码改成了下面的样子

   我在代码中加入一个静态的变量running,用于控制新线程中的循环计数

   我在新线程中写入一个循环,当runningtrue时,循环计数,并调用handler.sendMessage(msg)为主线程传递计数结果


[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. package com.example.handler4;  

  2.   

  3. import android.app.Activity;  

  4. import android.os.Bundle;  

  5. import android.os.Handler;  

  6. import android.os.Looper;  

  7. import android.os.Message;  

  8. import android.util.Log;  

  9. import android.view.View;  

  10. import android.view.View.OnClickListener;  

  11. import android.widget.Button;  

  12. import android.widget.ProgressBar;  

  13.   

  14. public class MainActivity extends Activity {  

  15.   

  16.     Button startButton = null;  

  17.     Button stopButton = null;  

  18.     ProgressBar progressbar = null;  

  19.     Thread counter = null;  

  20.       

  21.     //线程执行的标志,当为true时,线程中继续循环  

  22.     static boolean running = true;   

  23.   

  24.     //获取主线程的looper  

  25.     Looper looper = Looper.getMainLooper();  

  26.   

  27.       

  28.     @Override  

  29.     protected void onCreate(Bundle savedInstanceState) {  

  30.         super.onCreate(savedInstanceState);  

  31.         setContentView(R.layout.activity_main);  

  32.           

  33.         startButton = (Button) findViewById(R.id.startButton);  

  34.         stopButton = (Button) findViewById(R.id.stopButton);  

  35.         progressbar = (ProgressBar) findViewById(R.id.progressBar);  

  36.           

  37.         //为button绑定onclicklistener  

  38.         startButton.setOnClickListener(new ButtonOnclickListener());  

  39.         stopButton.setOnClickListener(new stopOnclickListener());  

  40.     }  

  41.   

  42.     class ButtonOnclickListener implements OnClickListener{  

  43.         public void onClick(View v) {  

  44.             progressbar.setVisibility(View.VISIBLE);  

  45.             counter = new Thread(){  

  46.                 int i = 1;  

  47.                 @Override  

  48.                 public void run() {  

  49.                     // TODO Auto-generated method stub  

  50.                     while(running){  

  51.                         i += 10;  

  52.                         Message msg = handler.obtainMessage();  

  53.                         msg.arg1 = i;  

  54.                           

  55.                         //让线程延迟一秒  

  56.                         try {  

  57.                             Thread.sleep(1000);  

  58.                         } catch (Exception e) {  

  59.                             e.printStackTrace();  

  60.                         }  

  61.                         Log.i("run", "run "+i+"%");  

  62.                         Log.i("run", Thread.currentThread().getName());  

  63.                         msg.sendToTarget();       

  64.                           

  65.                         if(i>100)  

  66.                             //当计数超过一百时,跳出循环  

  67.                             running = false;  

  68.                     }  

  69.                 }  

  70.             };  

  71.             counter.start();  

  72.         }         

  73.     }  

  74.       

  75.     class stopOnclickListener implements OnClickListener{  

  76.         public void onClick(View v) {     

  77.             //点击取消按钮,分线程不再循环计数  

  78.             running = false;  

  79.             //让progressbar置成隐藏  

  80.             progressbar.setVisibility(View.GONE);  

  81.         }         

  82.     }  

  83.       

  84.     //将handler与主线程关联  

  85.     Handler handler = new Handler(looper){  

  86.         public void handleMessage(android.os.Message msg) {  

  87.               

  88.             int i =msg.arg1;  

  89.             //根据message中传来的参数控制进度条  

  90.             progressbar.setProgress(i);  

  91.               

  92.             Log.i("run", Thread.currentThread().getName());  

  93.                           

  94.             if(i>100){     

  95.                 //如果进度条慢,进度条隐藏  

  96.                 progressbar.setVisibility(View.GONE);  

  97.             }  

  98.         };  

  99.     };  

  100. }  

    后台打印日志的截图:

    



    这样,问题基本解决了,感觉自己对多线程的理解还是太浅了,很多时候容易想当然的来也代码,没有深刻理解代码背后的含义。还是要继续努力啊,当然还是要说一句,根据网上大神的说法,在android中多线程更多的是用AsyncTask,而不是Thread和Handler去更新UI。接下来,我就开始学习AsyncTask的用法。


本文转载自:http://blog.csdn.net/xiapinnong/article/details/22721129

tiansl

tiansl

粉丝 1
博文 17
码字总数 26152
作品 0
成都
私信 提问
Android 3即将发布 Google下周举办发布会

本周早些时候Google发布了Android 3.0蜂巢系统的预览版SDK软件开发工具包,让大家对这款新系统有一个初步的认识。为了让更多人对Android 3有更进一步的认识,Google计划在2月2日举办一次发布...

米狗族
2011/01/30
732
0
android应用开发简单理解

做了个应用,总结下对于android 应用的简单理解 从上图可以简单看出,主线程启动,这里把各种操作称为action,主要分为3部分: ui(视图绘制)、event(事件处理)和other(数据或网络等处理) 1.当...

blackylin
2013/06/18
649
2
Android EditText不弹出输入法总结,焦点问题的总结

看一个manifest中Activity的配置,如果这个页面有EditText,并且我们想要进入这个页面的时候默认弹出输入法,可以这样设置这个属相:android:windowSoftInputMode=stateVisible,这样就会默认...

带梦想一7飞
2013/07/12
363
0
深入理解Android消息处理系统——Looper、Handler、Thread

熟悉Windows编程的朋友可能知道Windows程序是消息驱动的,并且有全局的消息循环系统。而Android应用程序也是消息驱动的,按道理来说也应该提供消息循环机制。实际上谷歌参考了Windows的消息循...

惊天
2011/07/26
726
0
HTC败诉或殃及其他Android手机制造商

新浪科技讯 北京时间7月17日下午消息,美国国际贸易委员会(以下简称“ITC”)周五做出一项初步判决,裁定HTC Android产品侵犯苹果两项专利。分析师认为,这项裁决或许会对其它Android设备制造...

红薯
2011/07/17
1K
6

没有更多内容

加载失败,请刷新页面

加载更多

java发送html模板的高逼格邮件

最近做了一个监测k8s服务pod水平伸缩发送邮件的功能(当pod的cpu/内存达到指定阈值后会水平扩展出多个pod、或者指定时间内pod数应扩展到指定数量),一开始写了个格式很low的邮件,像下面这样...

码农实战
10分钟前
4
0
php-fpm配置文件详解/MariaDB密码重置、慢查询日志

来源:https://blog.csdn.net/Powerful_Fy php-fpm主配置文件路径:/usr/local/php-fpm/etc/php-fpm.conf #位于安装php安装目录下的etc/目录中,该文件中最后一行将配置文件指向:include=/...

asnfuy
14分钟前
2
0
川普给埃尔多安和内堪尼亚胡的信

任性 https://twitter.com/netanyahu/status/1186647558401253377 https://edition.cnn.com/2019/10/16/politics/trump-erdogan-letter/index.htm...

Iridium
36分钟前
10
0
golang-mysql-原生

db.go package mainimport ("database/sql""time"_ "github.com/go-sql-driver/mysql")var (db *sql.DBdsn = "root:123456@tcp(127.0.0.1:3306)/test?charset=u......

李琼涛
今天
5
0
编程作业20191021092341

1编写一个程序,把用分钟表示的时间转换成用小时和分钟表示的时 间。使用#define或const创建一个表示60的符号常量或const变量。通过while 循环让用户重复输入值,直到用户输入小于或等于0的值...

1李嘉焘1
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部