定时器任务不停止

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 的另一个实例的对象。 所以,你应该把你的计时器移到别处。