0

BroadcastReceiver을 통해 브로드 캐스트를 듣고 있습니다. 내 요구 사항의 성격에 따라 SQLite DB에서 상당한 시간 동안 중요한 데이터를로드해야합니다. 데이터가 빨리 필요합니다. BroadcastReceiver.onReceive 히트 전에 데이터를 미리로드하고 준비 할 수있는 이상적인 방법입니다.브로드 캐스트 수신기에 대해 시간에 민감한 방식으로 데이터로드

이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

+0

실제로 onReceive()가 실제로 호출되기 전에는 아무 것도 할 수 없습니다. 무엇이든지 onReceive()에서 서비스를 시작하고 알림을 게시하거나 완료하려고 할 때 (?) 완료하려고하면 – rperryng

+0

나는 그 방법을 시도했지만 여전히 필요한 것보다 오래 걸립니다. 'onReceive() '전에 할 수있는 일에 대해 문서화 된 것은 아무것도 없다는 것을 깨달았습니다. – kishu27

답변

0

이 내가 촬영 한 방법입니다. BroadcastReceiver이 시작될 때 (또는 차례로 Service을 시작할 때) 처리에 중요한 각 열 테이블의 열의 최소 집합으로 다른 테이블을 만들었습니다.

이 새 테이블은 검색에 사용하는 열 (where 절)까지 필요한 모든 테이블간에 조인의 데카르트 제품을 유지하도록 설계되었습니다. 이 테이블은 Thread을 관리하는 Service을 통해 다시 작성됩니다. 이 스레드는 모든 데이터를 처리하고 "소화"하여 앱에서 처리하기 쉬운 형식으로 처리합니다. 그것은 다이제스트 된 데이터를 테이블에 저장합니다. 실행중인 작업자 스레드를 중지 할 방법이 없기 때문에 IntentService을 사용하지 않았습니다.

내가 지금하고있는 일은 Service이 시작될 때 DB를 쿼리하고 SQLite DB에서 원하는 절대 행을 얻고 작업하는 것이다. 앱이 어떻게 쉽게 처리를 시작할 수 있는지에 대해서는 이미 단순화되어 있기 때문에 처리 시간에 다른 오버 헤드가 없습니다. 우리는 결과를 얻 자마자 사업을 시작합니다.

이것은 아직 내 최종 접근 방식을 상상했던 가장 완벽한 방법은 아니지만 SQLite 데이터베이스 액세스의 현재 속도를 감안할 때 정상적으로 작동합니다.

1

static 코드를 포함하지 않으면 onReceive 호출 전에 BroadcastReceiver에서 아무 것도 수행 할 수 없습니다. 당신이 할 수있는 유일한 일은 디폴트 (인자없는) 생성자를 오버라이드하는 것입니다. 그러나 데이터베이스에 접근하고 열 수있는 유효한 Context을 가지고 있지 않기 때문에 도움이되지 않습니다. (Context은 인수는 onReceive).

할 일이 너무 길어서 BroadcastReceiver에서 처리 할 수없는 경우 수신자가 서비스를 시작하고 대신 그 곳에서 작업해야합니다. 서비스를 계속 유지하고 싶지 않은 경우 IntentService을 사용할 수 있습니다. IntentServiceonHandleIntent에서 완료된 작업이 끝나면 자체 수명주기를 관리하고 자체 작업을 중단합니다.

브로드 캐스트 리시버 :

public class MyReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     intent.setClassName(context, MyService.class); 
     context.startService(intent); 
    } 
} 

서비스 :

문제는 데이터의 지연이었다

public class MyService extends IntentService { 
    private static final String TAG = "MyService"; 

    // default constructor is required for all application components 
    public MyService() { 
     super(TAG); 
    } 

    @Override 
    public void onHandleIntent() { 
     // do your work here 
    } 
} 
+0

물론 이것을 처리 할'Service'를하고 있습니다. 이 작업은 시간에 민감하기 때문에 DB의 본질이 일부 테이블 간의 조인에 걸쳐 있기 때문에 전체 데이터 수집 부분은 여전히 ​​느립니다. 나는 내가 끝내 준 대답으로 다른 접근법을 언급하고있다. – kishu27