現在、Firebase JobDispatcherを使用して、サービスインテント(ブート時に登録された&アップデートをインストール)を使用して定期チェックをバックグラウンドで実行しています。これは正常に動作しており、メインスレッドとは別に独自のスレッドが生成されるため、UIをロックせずスレッドを正しく終了させてガベージコレクションが問題にならないようにします。メインスレッドを使用してFirebase JobDispatcherをBGスレッドにトリガーする
私はまた、この同じ正確な仕事をアプリ内のメインスレッドから起動したいと思います。問題は、jobdispatcher onCreateを実行するとジョブがメインUIスレッドで実行され、バックグラウンドスレッドでは実行されないということです。私の関数の1つはたくさんのオブジェクトを生成することができるので、GCが決してすべての迷惑メールを取り除くことができないため、正しく実行されても、アプリケーションの使い勝手が悪くなります。
メインスレッドから、必要に応じて既存のJobDispatcherジョブを実行できますが、別のスレッドで実行するにはどうすればよいですか?
ありがとうございました。
編集この具体的な使用方法の明確化のために
私の特定のケースではUpdateNetworkerJob.classを実行するために数分かかることが最初の実行を伴います。 phoneHistoryCheck.GetLastCallChecked()関数には、Firebaseへの呼び出しを複数回行うループがあり、情報を取得して入れます。
9/12更新
以降の実行は非常に迅速であり、AsyncTaskが動作することができます。しかし、私はより堅牢な解決策が必要であることを発見しており、現在はThreadPoolExecutorを見ています。 GetLastCallChecked()関数がFirebaseエンジンにあまりにも多く投げている可能性があり、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;
}
}
あなたの投稿は述べています。それは 'UpdateNetworkerJob'を参照していますか?私はワーカースレッドをどこに作成しているのかわかりません。あなたはまた、次のように述べています:_問題は、ジョブのディスパッチャーonCreateを実行すると、ジョブがメインUIスレッドで実行され、バックグラウンドスレッドでは実行されないということです。スケジュールされたジョブは、それをスケジュールするスレッドに関係なく、メインスレッド上で実行される 'JobService'です。独自のJobServiceワーカースレッドを作成する必要があります。参照:[JobService docsの紹介](https://developer.android.com/reference/android/app/job/JobService.html) –
修正してください。ブロードキャストレシーバを拡張する私のクラスは元の質問には含まれていません。同様のFirebaseJobDispatcherを実行していますが、インテントの下でマニフェストに登録されています:BOOT_COMPLETED、PACKAGE_REPLACED、PACKAGE_ADDED。 このように実行すると、アプリケーション用の別のスレッドがAndroidモニターで生成され、強制終了されるのがわかります。 「スレッド/ハンドラ/ AsyncTask」という言葉を指し示すこれらのドキュメントは、作業をオフロードするために必要です。それはあなたが意味することですか?だから、これは以下の論理の行に従っています。何とか別のスレッドを手動で起動する必要があります。 ご協力いただきありがとうございます。 –
スレッド名は 'Thread.currentThread()。getName()'で得ることができます。これを 'UpdateNetworkerJob'のログ出力に追加してください。あなたのBroadcastReceiverから起動しても、メイン/ UIスレッドになると確信しています。はい、ワーカースレッドやAsyncTaskで長時間処理を実行するには、 'UpdateNetworkerJob'を再作成する必要があります。 –