2014-05-22 2 views
0

scheduleAtFixedRate에 문제가 있습니다. 한 번만 호출되며 반복하지 않습니다. 뭐가 잘못 되었 니?Android - 서비스 : 한 번만 반복

public class TimerService extends Service { 
static final int UPDATE_INTERVAL=3000; 
private Timer timer = new Timer(); 
private Date date; 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    repeatJob(); 
    //Here we want this service to continue running until it is explicitly stopped, so return sticky 
    return START_STICKY; 
} 

private void repeatJob() { 
    timer.scheduleAtFixedRate(new TimerTask() { 
     @Override 
     public void run() { 
      Looper.prepare(); 

      date = new Date(); 
      displayToast(date.toString()); 
      Log.d("repeat", new Date().toString()); 

      Looper.loop(); 
     } 
    }, 0, UPDATE_INTERVAL); 
} 

private void displayToast(String text) { 
    Toast.makeText(this, text, Toast.LENGTH_LONG).show(); 
} 

}

나는 조각 활동에서 서비스를 호출 :

getActivity().startService(new Intent(getActivity().getApplicationContext(), TimerService.class)); 

가 어떻게 조각 활동 서비스에서 (미래에 어쩌면 더 많은 값) 날짜의 현재 값을받을 수 있나요?

감사합니다.

답변

1

당신은 내가 정확하게 문제의 원인을 모르겠어요, 여기에 많은 이상한 일을하고 있지만이 정상적으로 수행 할 수 얼마나 당신을 말할 것이다 :

당신은에 대한 서비스를 예약 할 AlarmManager를 사용한다 반복 실행하고, 타이머를 제거하십시오. Timer는 프로세스가 작동 중일 때만 작동하지만 AlarmManager는 응용 프로그램의 프로세스가 실행 중이 아니더라도 보류중인 인 텐트를 기억합니다 (이 경우 시작됩니다). 또한 더 많은 메모리와 배터리 효율을 자랑합니다. 중앙 집중식 시스템이기 때문에 모든 프로그램에 대해 프로그래밍 된 작업을 관리 할 수 ​​있습니다.

서비스가 스스로 일정을 조정하면 안되며 단지해야 할 작업을 수행해야합니다. 그것들이 메인 쓰레드에서 실행된다는 것을 알아 두십시오, 그래서 당신은 워커 쓰레드를 생성해야합니다. IntentService을 사용해보십시오. 이미 완료되었습니다. 결과를 활동으로 되돌리기 위해 서비스는 추가 정보의 데이터를 포함하는 활동에 의도를 전송할 수 있습니다. 또한 결과를 브로드 캐스트하고 활동의 브로드 캐스트 리시버에서 처리하거나 서비스에 바인드하여 콜백을 등록 할 수도 있습니다.

Looper 라인을 제거하십시오. 타이머를 제거한 후에이 라인을 제거 할 필요가 없습니다.

마지막으로, START_STICKY 플래그가하는 일에 대해 약간 혼란스러워 보입니다. 에 대한 서비스는 "명시 적으로 중지 될 때까지 계속 실행"입니다. Android에서 무기한으로 서비스가 실행되도록 보장 할 수있는 방법은 없습니다. 이 플래그가하는 일은 메모리가 부족하여 서비스를 종료하는 경우 시스템이 복구되면 서비스를 다시 작성하려고 시도하지만 보류중인 의도를 다시 전달하지 말아야한다는 것입니다. 더 많은 정보 here.

+0

START_STICKY 앞에있는 댓글은 내 교수의 원본 코드에서 복사됩니다. IntentService에 대한 첫 번째 질문 : 다음과 같이 서비스에 Intent를 작성했습니다. Intent retIntent = new Intent (TimerService.this, MainActivity.class); retIntent.putExtra ("date", date.toString()); MainActivity에서 날짜를 얻으려면 어떻게해야합니까?알람 관리기에 대한 질문 : 내가 서비스의 onHandleIntent에 알람 관리기를 사용하려고하지만, 응용 프로그램이 코멘트 너무 긴 것 때문에 내가 evrything을 쓸 수 없습니다 충돌합니다 ... :/ – honiahaka10

+0

에게 의도는 것 매개 변수로 액티비티의 onCreate (액티비티를 재 작성해야하는 경우) 또는 onNewIntent 메소드 (액티비티가 이미 활성 인 경우)로 전달됩니다. 그런 다음'Intent.getStringExtra'를 호출하여 문자열을 검색 할 수 있습니다. 두 번째 질문에 관해서는, 필요하다면 두 번째 질문을 열어서, 스택 추적을 게시하도록하십시오. –

0

확인. 난 그냥 똑같은 문제에 직면하고 이상한 것은 내가 제거했을 때 Looper.prepare & Looper.loop, 실제로는 주어진 시간 간격으로 실행하지만 실행이 성공적이지 않음 bcoz 그것이 필요하다고 말합니다 Looper.loop 지금까지 필자는 필 요한 이후로 제거 할 수 없습니다. ,하지만 때 거기에 작업을 한 번 실행 .. 플러스 메신저 안드로이드 전문가. 알려 주시면 알려드립니다.

관련 문제