在Android开发中,当我们实现导航页倒计时跳转时常会出现这样的问题:
1.计时器正在倒计时的时候点击跳转按钮,会出现跳两次的状况,这是其一;
2.其二,当计时器正在倒计时的时候按返回键,进入桌面后几秒后又进入应用。
以下代码解决了这个问题。
方法一: 使用handler
package com.example.daohangye;
import android.content.Intent;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
int count = 6;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
count--;
if (count == 0) {
Intent intent = new Intent(MainActivity.this, Main2Activity.class);
startActivity(intent);
} else {
handler.sendEmptyMessageDelayed(1, 1000);
tv.setText("倒计时:" + count);
}
}
};
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
handler.sendEmptyMessage(1);
tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, Main2Activity.class);
startActivity(intent);
handler.removeMessages(1);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
handler.removeMessages(1);
if (handler != null) {
handler = null;
}
}
}
方法二:使用Timer计时器
package com.example.text;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import java.util.Timer;
import java.util.TimerTask;
public class MainActivity extends AppCompatActivity {
private TextView tv;
private Boolean A=true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = findViewById(R.id.ss);
tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, Main2Activity.class);
startActivity(intent);
A=false;
finish();
Log.e("TAG",A+"");
}
});
//计时器
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
if(A==true) {
Intent intent = new Intent(MainActivity.this, Main2Activity.class);
startActivity(intent);
finish();
}
}
},6000);
}
@Override
protected void onDestroy() {
super.onDestroy();
A=false;
}
}
方法三:使用Handler和runnable
package com.example.mytest;
import android.content.Intent;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private int count = 4;
private Handler mHandler = new Handler();
private Runnable mRunnable = new Runnable() {
public void run() {
count--;
setTitle("" + count);
if (count==0){
setTitle("1");
Toast.makeText(MainActivity.this,"跳转",Toast.LENGTH_SHORT).show();
startActivity(new Intent(MainActivity.this,Main2Activity.class));
}else {
// 每3秒执行一次
mHandler.postDelayed(mRunnable, 1000); //给自己发送消息,自运行
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e("tag", ""+ "iioioioioioioio");
// 通过Handler启动线程
mHandler.post(mRunnable); //发送消息,启动线程运行
}
@Override
protected void onDestroy() {
//将线程销毁掉
mHandler.removeCallbacks(mRunnable);
super.onDestroy();
}
}