2017-04-21 8 views
1

잠이 응용 프로그램은 내가 주기적으로 요청을 발사 할 수있는 발리 요청 간격 구현시 : 그것은 잘 한 응용 프로그램이 포 그라운드에서와 같이 작동발리 TimeoutError

final Handler handler = new Handler(); 

    final int interval = 3000; 

    handler.postDelayed(new Runnable() { 
     public void run() { 

      // Volley request here... 
      Volleyclient client = Volleyclient.getInstance(); 
      client.doSomeVolleyRequest(MainActivity.this, someListener, someDataToSend); 

      handler.postDelayed(this, interval); 
     } 
    }, interval); 

합니다. 내가 홈 버튼을 누르면 앱이 잠들고 발리 TimeoutError가 발생하고 이유를 알 수 없습니다. "대기"모드 (화면 꺼짐)로 전환하면 같은 동작입니다. 내 앱을 포 그라운드로 토글하자마자 발리 요청을 계속합니다.

나는 잠 들어있는 동안 정말 시간 초과가 아니라 인터넷 연결 권한 문제가 아닌 것으로 생각됩니다. 다음과 같은 퍼미션을 사용합니다.

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.CALL_PHONE" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 

누가 그 행동에 대한 이유를 설명 할 수 있습니까? 앱이 실행될 때마다 내 앱이 계속 요청을 보내도록 조치 할 수 있다면 좋을 것입니다.

답변

2

나는이 문제가 당신의 스레드에 있다고 생각합니다. postDelayed 작업에서 UI 스레드로 이동합니다. 전화가 잠자기 상태 일 때 UI 스레드가 작동하지 않습니다. 스레드를 변경하면이 문제가 해결 될 것이라고 생각합니다. 작동하지 않으면 알려주세요.

편집 : 귀하의 행동 코드를 말씀하셨습니다. 그러나 휴대 전화가 잠겨 있거나 검은 색 화면이되면 모든 활동이 일시 중지 상태가됩니다. 수면 중에도 계속 일하고 싶다면 서비스을 사용해야합니다. 서비스에는 활동과 같은 라이프 사이클이 없습니다. 사용자가 중단하거나 사용자가 중단 할 때까지 전화에 연결되어 작동을 유지합니다 (응용 프로그램이 종료 된 경우에도). 나는 지금 내 자신의 질문에 대답 할 수 있어요 연구의 긴 시간 후 How to execute background task when Android app is closed/set to background?

+0

좋아,이 의미가 있습니다. 코드는 현재 내 MainActivity의 onCreate-Method에 직접 배치됩니다. 링크 나 샘플 코드를 게시하여 다른 스레드에 넣을 수있는 간단한 해결책을 가르쳐 주시겠습니까? – steven

+0

모든 것을 이제 서비스로 마이그레이션했습니다. 실제 장치에서 거의 동일한 동작. 내가 USB (디버깅)를 통해 연결되어있는 경우 앱이 포 그라운드에 있지 않으면 계속 전송합니다. USB 연결을 끊으면 포 그라운드가 아닌 경우 Volley TimeoutError가 표시됩니다. 모든 경우에 수면 모드에서 실패를 보냅니다 (표시 꺼짐). 앱을 포 그라운드로 되돌려 놓으면 모든 것이 잘 작동합니다. 매우 이상하고 anoying. – steven

+0

서비스 자체가 백그라운드에서 올바르게 작동하는 것 같습니다. 모든 경우 백그라운드에서 실행될 때 오류 토스트가 주기적으로 표시되어 스레드가 실행되는 것처럼 보입니다. 발리 통신이 실패합니다. – steven

0

:

잘 설명하는 예입니다. 나는 그것을 싫어하지만 다른 누구도 그것을 알아낼 수 없었다.

설명 된 동작의 간단한 이유는 다음과 같습니다. Doze 모드!

스레딩 문제가 아니었다. 단지 doze 모드로 전환되어 비활성화 된 네트워크 액세스였습니다. 도즈 모드의 한 가지 기능은 다음과 같습니다. 네트워크 액세스가 일시 중단되었습니다.

https://developer.android.com/training/monitoring-device-state/doze-standby.html

https://www.bignerdranch.com/blog/diving-into-doze-mode-for-developers/