2012-12-18 5 views
1

15 초마다 서버에서 끌어 와야하는 끌어 오기 기반 응용 프로그램이 있습니다. 이를 위해 나는 정상적인 AsyncTask를 사용, 내 코드는 기본적으로 다음과 같습니다 AsyncTask가 무작위로 멈춤

protected Void doInBackground(Context... arg0) { 
    while (true && this.pull_on) { 
    pull_data(); 
    TimeUnit.SECONDS.sleep(15) 
}; 

는 지금은 앱이 바로 갑자기 당겨 중지 엄청난 문제가 있습니다. No exeptions, AsyncTask의 상태가 '실행 중'인 경우 'pull_on'변수가 'true'로 설정되어 있지만 끌어 오기가 중지됩니다.

나는 not reproduce 수 있습니다. 때때로 발생하며, 오랫동안 완벽하게 작동 할 수 있습니다.

누구에게 이런 일이 발생할 수있는 아이디어가 있습니까?

리팩토링하고 이것을 타이머로 구현해야합니까?

또한 서비스를 사용하면 어떤 이점이 있습니까? 배터리 전원은 문제가되지 않습니다.

도움 주셔서 감사합니다.

P. 나는 Activity가 AsyncTask를 형성하기 시작하기도한다고 덧붙여 야한다. 이렇게 'ApplicationManager.getCurrentActivity(). startActivity (myIntent)'하지만 문제가 될 필요는 없습니다.

P.P.S.

타이머 솔기는 내가 사용하기를 원하는 것으로 제한되어야합니다. 매 15 초마다 뭔가를하고 싶지만 어떤 특별한 경우에는 핑을 중지하고 다시 시작해야합니다. 그 이음새에 대한 해킹 양은 AsyncTask를 사용하여 더 많은 작업을 수행 할 수 있습니다.

+0

. 그리고 pull_data()에서 무엇을하고 있습니까? – ben75

+0

나는 어떤 메시지를 받았는지에 따라 JSON을 다시 얻는다. 나는 액티비티를 시작하거나, 데이터베이스에서 무엇인가를 업데이트한다. 또는 앱이 배경에 있다면 알림을 생성한다. – nickik

답변

1

끔찍한 디자인입니다. 15 초마다 백그라운드에서 무한 루프가 발생하기를 원하지 않습니다. 앱이 주요 문제 중 하나 인 것처럼 백그라운드로 밀려 나면 배터리가 소모됩니다.

적절한 방법 중 하나는 알람을 설정하고 이에 대응하는 것입니다. 타이머도 나쁜 옵션이 아닙니다. 내가 제안

당신은

서비스가 백그라운드에서 실행 시간이 긴 작업을 수행 할 수 있으며, 사용자 인터페이스를 제공하지 않는 응용 프로그램 구성 요소처럼 보이는 것입니다 서비스,이 이동 조사

장기 실행 작업에 대해 이야기하지만 반복 동작도 서비스로 옮겨야합니다. 서비스에

공식 문서는 여기에 있습니다 : 작업 중지 무슨 일이 일어나고 있는지 볼 수 당기는 때 스레드 덤프를 할 수 http://developer.android.com/guide/components/services.html

+0

앱은 드라이브 용이고 전화 플러그가 꽂혀 있기 때문에 배터리는 문제가되지 않습니다. 그렇다면 서비스에 타이머를 제안 하시겠습니까? – nickik

+0

설명서에서 : 참고 : Alarm Manager는 응용 프로그램이 현재 실행 중이 아닌 경우에도 특정 시간에 응용 프로그램 코드를 실행하려는 경우에 사용됩니다. 통상의 타이밍 조작 (틱, 타임 아웃 등)에서는, Handler를 사용하는 것이 쉬우면서 훨씬 효율적입니다. – shalafi

+0

저는 무한 루프로 서비스를 설정할 수 있다고 믿습니다.서비스가 언 바인드되고 서비스가 취소/바인딩 해제 될 때 루프가 종료되는지 확인하십시오. – shalafi

관련 문제