定时器任务不停止
Timertask not stopping
您好,我一直在创建一个应用程序来检查 phone 是否正在使用 wifi 或移动数据,使用 timerTask 通知用户并广播接收器以检查 WIFI 或移动数据是否打开。
即使在我取消 timerTask 之后,它也会进入错误通知,然后 wifi 通知再次运行。
这个问题困扰我好几个小时了,我决定寻求帮助。
这是我的 MainActivity Class:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public String getConnectivityStatus(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
String status = null;
if (null != activeNetwork) {
if(activeNetwork.getType() == ConnectivityManager.TYPE_WIFI)
status = "WIFI";
if(activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE)
status = "DATA";
}
else{
status = "ERROR";
}
return status;
}
这是我的 NetworkChangeReceiver Class:
public class NetworkChangeReceiver extends BroadcastReceiver {
//WIFI TIMER
public void startWIFITimer() {
wifiTimer = new Timer();
initializeWIFITimer();
wifiTimer.schedule(wifiTimerTask, 1000, 5000);
}
public void stopWIFITimer() {
if (wifiTimer != null) {
wifiTimer.cancel();
wifiTimer = null;
}
}
public void initializeWIFITimer() {
wifiTimerTask = new TimerTask() {
public void run() {
wifiHandler.post(new Runnable() {
public void run() {displayNotificationWIFI();
}
});
}
};
}
@Override
public void onReceive(Context context, final Intent intent) {
contexts = context.getApplicationContext();
String status = main.getConnectivityStatus(context);
if (status.contains("WIFI")){
startWIFITimer();
}
else if (status.contains("DATA")){]
}
else if (status.contains("ERROR")){
displayNotificationERROR();
stopWIFITimer();
}
}
如果有人决定投反对票,最好能说明原因。再次提前感谢您的帮助! :D
每次您收到广播消息时,都会创建一个新的 BroadcastReceiver
实例。因此,当您调用 stopWIFITimer()
时,您实际上是在尝试停止一个从未启动的计时器,因为启动的计时器是 BroadcastReceiver
的另一个实例的对象。
所以,你应该把你的计时器移到别处。
您好,我一直在创建一个应用程序来检查 phone 是否正在使用 wifi 或移动数据,使用 timerTask 通知用户并广播接收器以检查 WIFI 或移动数据是否打开。
即使在我取消 timerTask 之后,它也会进入错误通知,然后 wifi 通知再次运行。
这个问题困扰我好几个小时了,我决定寻求帮助。
这是我的 MainActivity Class:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public String getConnectivityStatus(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
String status = null;
if (null != activeNetwork) {
if(activeNetwork.getType() == ConnectivityManager.TYPE_WIFI)
status = "WIFI";
if(activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE)
status = "DATA";
}
else{
status = "ERROR";
}
return status;
}
这是我的 NetworkChangeReceiver Class:
public class NetworkChangeReceiver extends BroadcastReceiver {
//WIFI TIMER
public void startWIFITimer() {
wifiTimer = new Timer();
initializeWIFITimer();
wifiTimer.schedule(wifiTimerTask, 1000, 5000);
}
public void stopWIFITimer() {
if (wifiTimer != null) {
wifiTimer.cancel();
wifiTimer = null;
}
}
public void initializeWIFITimer() {
wifiTimerTask = new TimerTask() {
public void run() {
wifiHandler.post(new Runnable() {
public void run() {displayNotificationWIFI();
}
});
}
};
}
@Override
public void onReceive(Context context, final Intent intent) {
contexts = context.getApplicationContext();
String status = main.getConnectivityStatus(context);
if (status.contains("WIFI")){
startWIFITimer();
}
else if (status.contains("DATA")){]
}
else if (status.contains("ERROR")){
displayNotificationERROR();
stopWIFITimer();
}
}
如果有人决定投反对票,最好能说明原因。再次提前感谢您的帮助! :D
每次您收到广播消息时,都会创建一个新的 BroadcastReceiver
实例。因此,当您调用 stopWIFITimer()
时,您实际上是在尝试停止一个从未启动的计时器,因为启动的计时器是 BroadcastReceiver
的另一个实例的对象。
所以,你应该把你的计时器移到别处。