Home | 简体中文 | 繁体中文 | 杂文 | Github | 知乎专栏 | Facebook | Linkedin | Youtube | 打赏(Donations) | About
知乎专栏

第 8 章 Schedule 计划任务

目录

8.1. 使用 Runnable 和 Handler 实现定时执行
8.1.1. 循环执行
8.1.2. 延迟执行
8.2. TimerTask 实现循环播放
8.2.1. Time 和 TimerTask 定时刷新
8.2.2. TimerTask 更新 UI
8.3. ScheduledExecutorService

8.1. 使用 Runnable 和 Handler 实现定时执行

原理是使用 handler.postDelayed 延迟 Runnable 的运行时间

		
package cn.netkiller.okhttp;

import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class RunnableActivity extends AppCompatActivity {

    private Handler handler = new Handler();
    private Runnable runnable = new Runnable() {
        public void run() {
            this.update();
            handler.postDelayed(this, 1000);// 1000 ms = 1s 间隔1秒
        }

        void update() {
            DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            time.setText(dateFormat.format(new Date()));
        }
    };
    private TextView time;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_runnable);

        time = (TextView) findViewById(R.id.time);
        time.setText("Start...");

        handler.postDelayed(runnable, 1000 * 5); // 5 秒后开始
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        handler.removeCallbacks(runnable);
    }

}		
		
		

8.1.1. 循环执行

		
//首先创建一个Handler对象
Handler handler=new Handler();   
//然后创建一个Runnable对像
Runnable runnable=new Runnable(){  
   @Override  
   public void run() {  
    // TODO Auto-generated method stub  
    //要做的事情,这里再次调用此Runnable对象,以实现每两秒实现一次的定时器操作  
    handler.postDelayed(this, 2000);  
   }  
};
  		
			
[提示]提示
请使用单例模式,否则每次都拿到 handler 都是新对象,无法管理已经运行的对象。
		
//使用PostDelayed方法,调用此Runnable对象  
handler.postDelayed(runnable, 2000);
  
//关闭此定时器,可以这样操作
handler.removeCallbacks(runnable);  

//移除所有的消息
handler.removeCallbacksAndMessages(null);		
		
			

下面用 ImageView 实现 Loading... 动画,实现方式,是吧图片 360 度旋转。

		
                <ImageView
                    android:id="@+id/imageViewLoading"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_gravity="center_horizontal"
                    android:scaleType="fitCenter"
                    android:visibility="invisible"
                    android:src="@android:drawable/ic_menu_rotate" />
		
		
			
		
		        ImageView imageViewLoading = view.findViewById(R.id.imageViewLoading);
		
 				Handler handler = new Handler(Looper.getMainLooper());
                Runnable runnable = new Runnable() {
                    int count = 1;

                    @Override
                    public void run() {
                        handler.postDelayed(this, 50);
                        imageViewLoading.setRotation(count);
                        //每隔一段时间要重复执行的代码
//                        System.out.println("第" + (count++) + "次执行");
                        if (count == 360) {
                            handler.removeCallbacks(this);
                            imageViewLoading.setVisibility(View.INVISIBLE);
                            linearLayoutSpaek.setVisibility(View.VISIBLE);
                        }
                    }
                };
                handler.postDelayed(runnable, 100);		
		
			

8.1.2. 延迟执行

		
	new Handler().postDelayed(() -> {
        picture.browsePictureFolder();
    }, 30000);		
		
		
		
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            MainActivity.this.finish();
        }
    }, 1800);		
		
		

Android 11

		
	new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
        public void run() {
            progressBar.setVisibility(View.INVISIBLE);
        }
    }, 3000);		
		
		

循环执行

		
		Handler handler = new Handler(Looper.getMainLooper());
        handler.postDelayed(new Runnable() {
            int count = 5;

            @Override
            public void run() {
                handler.postDelayed(this, 1000);
                runOnUiThread(() -> {
                    binding.textViewAdSkip.setText(String.format("逃过 %d", count));
                });
                count = count - 1;
                if (count == 0) {
                    handler.removeCallbacks(this);
                    binding.frameLayoutAd.setVisibility(View.INVISIBLE);
                    binding.frameLayoutFullscreen.setVisibility(View.VISIBLE);
                }
            }
        }, 1000);