1. Utilice Handler para implementar el bucle de sincronización
1. Establezca el tiempo del ciclo de sincronización
public static final int REGULAR_TIME = 60 * 60 * 1000; //1小时
2. Obtenga el controlador global
mHandler = new Handler(Looper.getMainLooper(), this);
3. Establezca el método de tarea del ciclo de tiempo Ejecutable
Runnable runnable = new Runnable() {
//要执行的任务
aaa();
mUiHandler.postDelayed(this , REGULAR_TIME); //循环执行
}
4. Llama al lugar correspondiente e inicia el ciclo de cronometraje.
//可以先执行一次
aaa();
//1小时后开启定时循环执行
mUiHandler.postDelayed(runnable,REGULAR_TIME);
2. Temporizador
1. Configura el temporizador
Timer timer;
TimerTask timerTask;
//设置定时器和任务的方法
protected void initTimer(){
timer = new Timer();
timerTask = new TimerTask() {
@Override
public void run() {
//要执行的任务
//TODO
Log.i(TAG, "执行任务");
}
};
}
2. Iniciar la ejecución
//5秒后执行,然后每隔5秒执行一次(任务是打印“执行任务”)
timer.schedule(timerTask,5*1000,5*1000);
3. Detener y cancelar el temporizador
timer.cancel();
timer = null;
timerTask.cancel();
timerTask = null;
4. Reinicia el temporizador
//重新设置定时器,并开启
initTimer();
timer.schedule(timerTask,5*1000,5*1000);
5. Resultados de la prueba
6. Demostración de prueba
(1) Actividad principal
package com.example.test;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import java.util.Timer;
import java.util.TimerTask;
/**
* @author
*/
public class MainActivity extends AppCompatActivity {
String TAG = "my";
TextView tvStart, tvStop, tvRestart,gotoLauncher;
Timer timer;
TimerTask timerTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViewAndListener();
//设置定时器
initTimer();
}
/**
* 设置定时器
*/
protected void initTimer(){
timer = new Timer();
timerTask = new TimerTask() {
@Override
public void run() {
Log.i(TAG, "执行任务");
}
};
}
protected void initViewAndListener(){
tvStart = findViewById(R.id.tv_start);
tvStop = findViewById(R.id.tv_stop);
tvRestart = findViewById(R.id.tv_restart);
gotoLauncher = findViewById(R.id.textView);
tvStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.e(TAG, "onClick: 开始");
//开始定时器,每隔5秒打印一次“执行任务”
timer.schedule(timerTask,5*1000,5*1000);
}
});
tvStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.e(TAG, "onClick: 取消定时器");
timer.cancel();
timer = null;
timerTask.cancel();
timerTask = null;
}
});
tvRestart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.e(TAG, "onClick: 重新开启");
//重新设置定时器,并开启
initTimer();
timer.schedule(timerTask,5*1000,5*1000);
}
});
gotoLauncher.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
}
}
(2)actividad_principal.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/tv_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/start"
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:paddingTop="20dp"
android:paddingBottom="20dp"
android:background="@drawable/textview_shape"
app:layout_constraintBottom_toTopOf="@+id/textView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/stop"
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:paddingTop="20dp"
android:paddingBottom="20dp"
android:background="@drawable/textview_shape"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/textView"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_restart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/restart"
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:paddingTop="20dp"
android:paddingBottom="20dp"
android:background="@drawable/textview_shape"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/textView"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
(3) Fondo de TextView, establecer borde y esquinas redondeadas
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="10dp"/>
<stroke
android:width="1dp"
android:color="@color/black"/>
</shape>