0

현재 서비스 목적을 사용하여 주기적으로 Firebase JobDispatcher를 사용하고 있습니다 (부팅시 등록, & 업데이트 설치). 이것은 올바르게 작동하고 있으며, 메인 쓰레드와 별개의 쓰레드이기 때문에 UI를 잠그지 않고 쓰레기 수집이 문제가되지 않도록 쓰레드를 적절하게 죽인다.메인 스레드를 사용하여 Firebase JobDispatcher를 BG 스레드로 트리거

기본 스레드 인앱에서 이와 똑같은 작업을 실행하고 싶습니다. 문제는 ondate 작업자를 onCreate로 실행하면 작업이 백그라운드 스레드가 아닌 기본 UI 스레드에서 실행되도록 트리거하는 것입니다. 내 함수 중 하나는 많은 객체를 생성 할 수 있으므로 제대로 실행 되더라도 GC가 모든 정크를 절대 없앨 수는 없으므로 응용 프로그램에서 유용성이 사라집니다.

메인 스레드에서 필요에 따라 기존 JobDispatcher 작업을 실행할 수 있지만 별도의 스레드에서 계속 수행하려면 어떻게해야합니까?

도움을 주셔서 대단히 감사드립니다. 이 특정 사용

내 특정 사건의 해명

편집은 UpdateNetworkerJob.class 실행하는 데 몇 분 정도 걸릴 수있는 첫 번째 실행을 포함한다. phoneHistoryCheck.GetLastCallChecked() 함수는 Firebase에 여러 번 호출하여 정보를 검색하고 처리하는 루프를 가지고 있습니다.

9/12 업데이트

후속 실행은 매우 신속하게, 그리고 AsyncTask를 작동 할 수 있습니다. 그러나 나는 좀 더 강력한 솔루션이 필요하다는 것을 알고 있으며 현재 ThreadPoolExecutor을보고 있습니다. GetLastCallChecked() 함수가 Firebase Engine에 너무 많이 던져서 Firebase에 대한 주 스레드의 호출이 발생하는 동안 소음이 줄어들 가능성이 있습니다. 이 부분을 정렬하는 중입니다.

FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(trackedContactListActivity.this)); 
     Job myJob = dispatcher.newJobBuilder() 
       .setService(UpdateNetworkerJob.class) 
       .setTag("UpdateNetworkerService") 
       .setTrigger(Trigger.NOW) 
       .setConstraints(
         Constraint.ON_ANY_NETWORK 
       ) 
       .build(); 

     dispatcher.mustSchedule(myJob); 

UpdateNetworkerJob.class

public class UpdateNetworkerJob extends JobService { 

private static final String TAG = "UpdateNetworkerJob"; 

@Override 
public boolean onStartJob(final JobParameters params) { 


    Log.d(TAG, "UpdateNetworkerJob is running with params: " + params); 
    PhoneHistoryCheck phoneHistoryCheck = new PhoneHistoryCheck(); 
    phoneHistoryCheck.GetLastCallChecked(UpdateNetworkerJob.this); 



    return false; 
} 

@Override 
public boolean onStopJob(JobParameters params) { 
    // Stop tracking these job parameters, as we've 'finished' executing. 
    //sendMessage(MSG_COLOR_STOP, params.getJobId()); 
    Log.d(TAG, "on stop job: " + params); 

    // Return false to drop the job. 
    return false; 
} 
} 
+0

귀하의 포스트는 말한다. 그건'UpdateNetworkerJob'을 말하는 겁니까? 나는 그것이 작업자 스레드를 만드는 곳을 보지 못했다. 또한 문제는 다음과 같습니다. _ 문제는 ondate 작업자를 실행하면 oncreate가 작업이 백그라운드 스레드가 아닌 기본 UI 스레드에서 실행되도록 트리거하는 것입니다. 스케쥴 된 작업은 스케쥴하는 쓰레드에 상관없이 메인 쓰레드에서 실행되는'JobService'입니다. 독자적인 JobService 작업자 스레드를 만들어야합니다. 참조 : [JobService 문서 소개] (https://developer.android.com/reference/android/app/job/JobService.html) –

+0

수정하십시오. Broadcast Receiver를 확장 한 클래스는 원래 질문에 포함되어 있지 않습니다. 비슷한 FirebaseJobDispatcher를 실행했지만 인 텐트의 매니페스트에 등록되었습니다 : BOOT_COMPLETED, PACKAGE_REPLACED, PACKAGE_ADDED. 이런 식으로 실행하면 내 응용 프로그램에 대한 별도의 스레드가 Android Monitor에서 생성되고 종료되는 것을 볼 수 있습니다. 언급 한 문서에서 "스레드/처리기/AsyncTask"작업을 오프로드하는 데 필요합니다. 이게 네가 말하는거야? 그래서 아래의 로직 라인을 따라 가야합니다. 수동으로 별도의 스레드를 시작해야합니다. 도움 주셔서 감사합니다. –

+0

'Thread.currentThread(). getName()'으로 스레드 이름을 얻을 수 있습니다. 그것을 'UpdateNetworkerJob'의 로그 출력에 추가하십시오. BroadcastReceiver에서 시작한 경우에도 메인/UI 스레드가 될 것이라고 확신합니다. 예, 작업 스레드 또는 AsyncTask에서 장기간 처리를 수행하려면'UpdateNetworkerJob'을 재 작업해야합니다. –

답변

관련 문제