2013-02-25 2 views
3

Activity이 일시 중지되었을 때 일정량의 데이터를 저장하려고합니다. 내 자신의 ContentProvider SQLite 데이터베이스와 함께 백업을 사용하고 있습니다. ContentProvider를 통해 작업을 완료하는 신뢰할 수있는 방법

의가 있다고 가정 해 봅시다

, 실제 절약을 perfoms 그 방법은 다음과 같습니다

public void saveData() { 
    //perform operations over ContentProvider in current thread 
} 

질문이다 : 그것은 단지 (새 스레드를 사용하여) onPause에서이 메소드를 호출하는 것이 안전합니다?

public void onPause() { 
    super.onPause(); 

    new Thread(new Runnable() { 

     public void run() { 
      saveData(); 
     } 
    }).start(); 
} 

아니면 백그라운드에서이 작업을 완료하는 새로운 Service을 시작해야합니까? 아니면 데이터가 저장되었는지보다 확실한 방법이 있습니까?

+0

제한된 시간에 스레드가 종료되는 한 그 문제는 보이지 않습니다. 그러나 후속 SQLite 작업은 해당 기간 동안 차단되므로 매우 빠른 일시 중지 - 다시 시작 시나리오는 약간 지연됩니다. –

+0

@ User117 문제는 내가 "유한"이라고 부를 수 있는지 잘 모르겠다. 예기치 않은 시간에 스레드가 종료된다고 가정 해 봅시다. –

+1

asyncTask 사용을 고려하십시오. 새 스레드를 시작하는 데 더 많은 시간이 걸립니다. – Leonidos

답변

1

바인딩 된 백그라운드 서비스를 사용해 볼 수도 있습니다. 더 나은 방법은 콘텐츠 공급자를 하나씩 랩핑하십시오. 이렇게하면 액티비티 상태에 상관없이 독립적으로 만들 수 있습니다. 원하는 언제든지 공급자 서비스에 get/save 요청을 게시하면됩니다.

+0

"귀하의 ContentProvider를 하나로 만듭니다"는 의미는 무엇입니까? –

+0

@DmitryZaitsev 오 .. 당신은'Service'와'ContentProvider'를 동시에 확장 할 수 없습니다. wrapped :'Service'를 확장하고'ContentProvider' 객체를 보유하는 것을 의미합니다. –

0

안전하지만이 목적으로 onPause()를 사용하지 않는 것이 좋습니다. 너무 자주 호출되었습니다 (활동 라이프 사이클 문서 참조). 그것을 onStop()으로 이동하십시오.

+0

onStop을 호출 할 수 있다는 보장은 없습니다. 그러니 조심해. – Leonidos

+0

onPause가 얼마나 자주 호출되고 onStop의 신뢰성이 없는지 고려하면 새로운 데이터가 생성/수정 될 때마다 저장하는 것이 좋습니다. – Budius

+0

필자의 경우'onPause'는 자주 호출되지 않습니다. 단편 모음이있는 단일 활동을 사용하고 있습니다. –

관련 문제