2017-10-10 2 views
-2

5 분마다 장치 저장 장치에 "Some text"를 기록해야하는데,이 작업을 수행하는 가장 좋은 방법이 있습니다. 하지만 메인 스레드가 멈추지 않고 로깅 스레드가 항상 살아 있어야합니다. 이 시도 그러나 당신의 긴 작업을 완료하기 위해 같은UI를 동결하지 않고 백그라운드 서비스를 실행하십시오.

public class DataWriteService extends Service { 

private FileIOHelper fileHelper= new FileIOHelper("Test.txt"); 
@Nullable 
@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 


@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 

    //Gets location and writes to a file 
    fileHelper.writeToFile(this, "Some text"); 

    return START_STICKY; 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
} 

}

+2

[서비스 용 JavaDocs] (https://developer.android.com/reference/android/app/Service.html) : "서비스는 스레드가 아닙니다."에서 [the 'onStartCommand()'에 대한 JavaDocs] (https://developer.android.com/reference/android/app/Service.html#onStartCommand (android.content.Intent, % 20int, % 20int)) : "시스템 서비스의 메인 스레드에서 이것을 호출합니다 ... 메인 스레드의 이벤트 루프를 멈추지 않도록해야합니다. 장기 실행 작업, 네트워크 호출 또는 과도한 디스크 I/O를 수행 할 때는 새 스레드를 시작해야합니다. " 스레드를 시작하지 않았으므로 작업이 UI를 고정시킵니다. – CommonsWare

답변

0

사용 Handler 또는 별도의 백그라운드 스레드를 할 수있는 더 좋은 방법이 내 에뮬레이터 를 동결 할 것으로 보인다. 일단 끝나면 UI 스레드에 값을 게시하십시오.

Btw, Android O +에서는 서비스가 살아있을 때만 서비스가 실행됩니다. 앱이 백그라운드에서 실행되자 마자 앱이 서비스를 종료합니다. JobScheduler 사용을 고려하십시오.

관련 문제