频道栏目
首页 > 程序开发 > 移动开发 > Android > 正文
Android使用Thread的interrupt与sleep,重启或暂停线程任务
2017-11-29 11:11:05      个评论    来源:贵公子丶专栏  
收藏   我要投稿

Android使用Thread的interrupt与sleep,重启或暂停线程任务


本文给出一个例子,简单说明如何在Android诸如Activity中,重启或者暂停一个正在无限运作的线程。
需求描述:假设在Android的Activity中,有一个线程,永不停息的运作,若当前Activity处于用户可见状态时候,每隔一秒输出一个自增长的计数器值,但是当Activity处于用户不可见时候,暂停线程输出,即中断线程执行。
实现这一机制的关键点简言之,借助Thread的sleep,让sleep在一定条件下(比如一个状态机布尔值)休眠一个极大值Long.MAX_VALUE。然后在Android的Activity生命周期回调中,重新赋值状态机布尔值,同时使用Thread的interrupt方法,打断当前处于休眠状态的线程,使之重新恢复正常运转。
代码如下:

  1. packagezhangphil.thread;
  2.  
  3. importandroid.support.v7.app.AppCompatActivity;
  4. importandroid.os.Bundle;
  5. importandroid.util.Log;
  6.  
  7. publicclassMainActivityextendsAppCompatActivity{
  8. privateStringTAG=“输出”;
  9. privateintcount=0;
  10. privatebooleanRUN=true;
  11.  
  12. privateLongTimeWorkmThread=newLongTimeWork();
  13.  
  14. @Override
  15. protectedvoidonCreate(BundlesavedInstanceState){
  16. super.onCreate(savedInstanceState);
  17.  
  18. mThread.start();
  19. }
  20.  
  21. privateclassLongTimeWorkextendsThread{
  22. @Override
  23. publicvoidrun(){
  24. while(true){
  25. try{
  26. if(!RUN){
  27. Thread.sleep(Long.MAX_VALUE);
  28. }
  29. }catch(Exceptione){
  30. e.printStackTrace();
  31. }
  32.  
  33. count++;
  34. Log.d(TAG,count+”“);
  35.  
  36. try{
  37. Thread.sleep(1000);
  38. }catch(InterruptedExceptione){
  39. e.printStackTrace();
  40. }
  41. }
  42. }
  43. }
  44.  
  45. @Override
  46. protectedvoidonResume(){
  47. super.onResume();
  48.  
  49. RUN=true;
  50. mThread.interrupt();
  51. }
  52.  
  53. @Override
  54. protectedvoidonPause(){
  55. super.onPause();
  56.  
  57. RUN=false;
  58. }
  59. }
    package zhangphil.thread;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    
    public class MainActivity extends AppCompatActivity {
        private String TAG = "输出";
        private int count = 0;
        private boolean RUN = true;
    
        private LongTimeWork mThread = new LongTimeWork();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            mThread.start();
        }
    
        private class LongTimeWork extends Thread {
            @Override
            public void run() {
                while (true) {
                    try {
                        if (!RUN) {
                            Thread.sleep(Long.MAX_VALUE);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
    
                    count++;
                    Log.d(TAG, count + "");
    
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    
        @Override
        protected void onResume() {
            super.onResume();
    
            RUN = true;
            mThread.interrupt();
        }
    
        @Override
        protected void onPause() {
            super.onPause();
    
            RUN = false;
        }
    }
点击复制链接 与好友分享!回本站首页
上一篇:Android沉浸式(侵入式)标题栏(状态栏)Status开发教程
下一篇:android studio 图片资源的存放位置?
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站