0

現在、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; 
} 
} 
+0

あなたの投稿は述べています。それは 'UpdateNetworkerJob'を参照していますか?私はワーカースレッドをどこに作成しているのかわかりません。あなたはまた、次のように述べています:_問題は、ジョブのディスパッチャーonCreateを実行すると、ジョブがメインUIスレッドで実行され、バックグラウンドスレッドでは実行されないということです。スケジュールされたジョブは、それをスケジュールするスレッドに関係なく、メインスレッド上で実行される 'JobService'です。独自のJobServiceワーカースレッドを作成する必要があります。参照:[JobService docsの紹介](https://developer.android.com/reference/android/app/job/JobService.html) –

+0

修正してください。ブロードキャストレシーバを拡張する私のクラスは元の質問には含まれていません。同様のFirebaseJobDispatcherを実行していますが、インテントの下でマニフェストに登録されています:BOOT_COMPLETED、PACKAGE_REPLACED、PACKAGE_ADDED。 このように実行すると、アプリケーション用の別のスレッドがAndroidモニターで生成され、強制終了されるのがわかります。 「スレッド/ハンドラ/ AsyncTask」という言葉を指し示すこれらのドキュメントは、作業をオフロードするために必要です。それはあなたが意味することですか?だから、これは以下の論理の行に従っています。何とか別のスレッドを手動で起動する必要があります。 ご協力いただきありがとうございます。 –

+0

スレッド名は 'Thread.currentThread()。getName()'で得ることができます。これを 'UpdateNetworkerJob'のログ出力に追加してください。あなたのBroadcastReceiverから起動しても、メイン/ UIスレッドになると確信しています。はい、ワーカースレッドやAsyncTaskで長時間処理を実行するには、 'UpdateNetworkerJob'を再作成する必要があります。 –

答えて

0

AsynctaskdoinBackground関数からあなたのサービスの意図を呼んでください。例は次のとおりです。Asynctask documentation

Asynctaskは、UIの結果を保持せずにUIから制御できます。

+0

これはJobDispatcherを使用するのではなく、これですか?このシナリオでは、私はUpdateNetworkerJob.classからトリガしていた関数をAsyncTaskに入れます。 –

+0

もう1つのフォローアップの質問:AsyncTaskには、内部のオブジェクトの実行時間に制限はありませんか?これらのアプリケーションを初めて実行するときは、数分間実行できます。 –

+0

@VinceAnido - はい、技術的には、JobDispatcherから関数を取り出し、Asynctaskに直接挿入することができます。 AsyncTaskは、バックグラウンドで実行され、主なアクティビティが破棄されても継続するため、数分間実行できます。しかし、複数のAsyncTaskが同時に実行されないようにするには、Asynctaskの "onPreexecute"機能で何らかのチェックを行い、1つのタスクしか実行していないことを確認する必要があります。 –

0

AsyncTaskには、内部の動作時間に制限がありますか?これらのアプリケーションを初めて実行するときは、数分間実行できます。

Threading performanceの記事をご覧ください。

AsyncTaskを使用する場合、注意する必要があるいくつかの重要なパフォーマンスの側面があります。

まず、デフォルトで、アプリケーションは作成するすべてのAsyncTaskオブジェクトを単一のスレッドにプッシュします。したがって、それらはシリアル方式で実行され、メインスレッドと同様に、特に長いワークパケットがキューをブロックする可能性があります。このためは、私たちは、あなただけの期間で5msの

HandlerThreadThreadPoolExecutor他の選択肢を提供してより短いハンドル作業項目にAsyncTaskを使用することを示唆しています。

あなたはこの記事でHandlerThreadのコード例を見つけることができます:_thisが正しく動作している、そしてそれは自分のthread_だスポーン:

Call Main thread from secondary thread in Android

+0

これは多くの意味があります。私は自分の関数にAsyncTaskをうまく実装したと思うし、物事ははるかに高速ですが、最初の実行が行われたときにANRポップアップが表示されます。 Firebase Engineのキューに溢れているのか、それとも何か他のものが原因であるかどうかはまだ分かりません。この実装に自分の問題を解決するかどうかを試してみましょう。 –

+0

アプリケーションに時間のかかる初期設定段階がある場合は、スプラッシュ画面を表示するか、またはメインビューをできるだけ早くレンダリングし、読み込み中であることを示し、情報を非同期的に入力することを検討してください。どちらの場合でも、アプリケーションがフリーズしているとユーザが感じないように、進行状況が何らかの形で示されている必要があります。 (https://developer.android.com/training/articles/perf-anr.htmlから) –

+0

これは非常に良い点です。私がMVPを一緒にハッキングしているので、私は搭乗中のアクティビティの優先順位を引き下げました。今はおそらくそれをやるのが楽しい時です。私はまだこれを解決する必要がありますが、それは私の主な活動に固執するのではなく、正しく組織化するのに役立ちます。 –

関連する問題