android中Handler的初步认识(四)

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

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

       我在主线程的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中Handler的初步认识(四)_第1张图片


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


你可能感兴趣的:(android中Handler的初步认识(四))