2017-11-14 4 views
0

안녕하세요 저는 와이파이 또는 모바일 데이터가 열려 있는지 확인하기 위해 timerTask를 사용하여 사용자와 브로드 캐스트 수신기에 알리기 위해 휴대 전화가 wifi 또는 모바일 데이터를 사용하는지 확인하는 앱을 만들었습니다.Timertask not stopped

timerTask를 취소 한 후에도 오류 알림으로 이동 한 다음 wifi 알림이 다시 실행됩니다.

나는 몇 시간 동안이 문제에 갇혀 있었고 몇 가지 도움을 청하기로 결정했습니다.

이 내 MainActivity 클래스입니다 :

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 클래스입니다 :

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(); 
     } 
    } 

그리고 누군가 downvote하기로 결정하면, 이유를 얻을 것이 좋을 것이다. 어떤 도움을 주셔서 다시 한번 감사드립니다! : D

답변

3

브로드 캐스트 메시지를받을 때마다 BroadcastReceiver의 새 인스턴스가 만들어집니다. 따라서 stopWIFITimer()으로 전화하면 시작한 타이머가 BroadcastReceiver의 다른 인스턴스의 개체이므로 실제로 시작하지 않은 타이머를 중지하려고합니다. 그래서 다른 곳으로 이동해야합니다.

+0

통찰력을 가져 주셔서 감사합니다. 저는 필요에 맞게 서비스로 전환했습니다. 왜 그런 짓을했는지 설명해 주셔서 감사합니다! –