Dagger 2を使用してAndroid優先ジョブキューにオブジェクトを挿入するにはどうすればよいですか?

snafu109

Dagger 2を使用して、Retrofit2とAndroidPriority JobQueueを統合しようとしています。

ここで間違ったパターンを使用している可能性があります(JavaとAndroidは初めてです)が、実行前にシリアル化されてから逆シリアル化されるオブジェクトからDaggerで作成されたRetrofitインスタンスにアクセスしようとしています(Android Job Queueはシリアル化されます)ディスクに永続化されるジョブ)。依存関係の1つでSharedPreferencesを使用しているため、RetrofitインスタンスはApplicationDaggerコンポーネントによって作成されます。

Retrofit自体はシリアル化できないため、作成時にRetrofitをジョブに渡すことができません。

アプリケーションもシリアル化できないため、実行時にジョブからApplication Daggerコンポーネントを参照できません(((MyApplication) myApplication).component().inject(this);逆シリアル化されたジョブにApplicationオブジェクトが存在しないため、Activitiesから実行できるように注入できないためです。 )

仕事のためだけに別のインスタンスを作成するのではなく、効率のためにアプリの残りの部分で使用されるRetrofitインスタンスを使用したいと思います。それも可能ですか?

使用するProvider<T>か、ファクトリが役立つかどうかは今のところ私の理解を超えているのでわかりませんが、その場合は、物事を構造化する方法についてのヒントが欲しいです!

編集:これは、Android Priority JobQueueを使用してジョブを作成する方法です。注入をどのように機能させたいかを示すためにサンプルを変更しました。ジョブはonAdded()、次のコマンドで実行される前にシリアル化および逆シリアル化されますonRun()

// A job to send a tweet
public class PostTweetJob extends Job {

    @Inject MyService webservice;
    public static final int PRIORITY = 1;
    private String text;

    public PostTweetJob(String text) {
        // This job requires network connectivity,
        // and should be persisted in case the application exits before job is completed.
        super(new Params(PRIORITY).requireNetwork().persist());
    }
    @Override
    public void onAdded() {
        // Job has been saved to disk.
    }
    @Override
    public void onRun() throws Throwable {
        // Job logic goes here
        webservice.postTweet(text);
    }
    @Override
    protected void onCancel() {
        // Clean up
    }
}
snafu109

これが私が管理できる最も簡単な解決策です。

まず、BaseJobクラスを作成しますこれが注入ターゲットになります。

public abstract class BaseJob extends Job {
    // annotate fields that should be injected and made available to subclasses
    @Inject MyService service;

    protected BaseJob(Params params) {
        super(params);
    }
}

宣言されているabstractため、Jobクラスで宣言されている抽象メソッドをオーバーライドする必要はありません代わりに、から継承するジョブでメソッドがオーバーライドされBaseJobます。

から継承するジョブを作成しますBaseJob注入されたフィールドはすべてBaseJob使用できます。

public class MyActualJob extends BaseJob {
    public static final int PRIORITY = 1;

    public MyActualJob() {
        super(new Params(PRIORITY).requireNetwork().persist());
    }

    @Override
    public void onAdded() {
        // job added to queue
    }

    @Override
    public void onRun() throws Throwable {
        // do the work
        // service will be injected into BaseJob, so you can use it here
        final Call<User> call = service.getUser();
        call.execute();
    }

    @Override
    protected void onCancel() {
        // clean up
    }
}

最後に、物事がリンクアップしていることを確認するために、追加DependencyInjectorJobManagerそれが作成されますとき。これはジョブに注入されBaseJobます:

DependencyInjector dependencyInjector = new DependencyInjector() {
    @Override
    public void inject(Job job) {
        // this line depends on how your Dagger components are setup;
        // the important part is to cast job to BaseJob
        ((MyApplication) app).component().inject((BaseJob) job);
    }
};
Configuration configuration = new Configuration.Builder(getApplicationContext())
        .injector(dependencyInjector)
        .build();
JobManager jobManager = new JobManager(getApplicationContext(), configuration);

使用BaseJobスキップして直接注入してみMyActualJobませんか?これは機能しますが、インジェクションターゲットであるジョブが複数ある場合instanceofは、作成時にどの種類のジョブが作成されているかを確認jobし、正しいクラスにキャストする必要があると思いますDependencyInjector

DependencyInjector dependencyInjector = new DependencyInjector() {
    @Override
    public void inject(Job job) {
        if (job instanceof MyActualJob) {
            ((MyApplication) app).component().inject((MyActualJob) job);
        } else if (job instanceof MyRealJob) {
            ((MyApplication) app).component().inject((MyRealJob) job);
        } else if (job instanceof MyBetterJob) {
            ((MyApplication) app).component().inject((MyBetterJob) job);
        }
    }
};

私の場合、すべてではないにしてもほとんどのジョブが同じグローバルオブジェクトにアクセスする必要があるため、サブクラスBaseJob化してそれを唯一のインジェクションターゲットとして使用する方がクリーンです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Dagger 2を使用してAndroid優先ジョブキューにオブジェクトを挿入するにはどうすればよいですか?

分類Dev

AndroidでDagger2を使用して、アクティビティオブジェクトを簡単に挿入するにはどうすればよいですか?

分類Dev

ViewModelを作成し、dagger 2を使用してリポジトリを挿入するにはどうすればよいですか?

分類Dev

Dagger 2を使用してサーブレットに注入するにはどうすればよいですか?

分類Dev

Dagger 2を使用して、複数のコンポーネントを使用して同じオブジェクトに注入するにはどうすればよいですか?

分類Dev

Dagger2 androidでViewModelのコンストラクターインジェクションを使用するにはどうすればよいですか?

分類Dev

dagger2を使用してモデルクラスのシングルトンオブジェクトを設定および取得するにはどうすればよいですか?

分類Dev

Dagger-2:スコープに応じて同じオブジェクトタイプに対して異なるインスタンス化を作成するにはどうすればよいですか?

分類Dev

dagger.androidを使用して、実行時にバンドルからパラメーターを挿入するにはどうすればよいですか?

分類Dev

Dagger 2のサブグラフに名前付きコンポーネントを挿入するにはどうすればよいですか?

分類Dev

Dagger 2 を使用して実行時にフィールドを挿入するにはどうすればよいですか?

分類Dev

dagger2をAndroidStudioJavaライブラリプロジェクトで動作させるにはどうすればよいですか

分類Dev

Dagger2で任意の種類のオブジェクトに依存関係を挿入する方法は?

分類Dev

Dagger 2によって作成されたオブジェクトはAndroidにどのくらい残りますか/ Dagger 2はAndroidアクティビティライフサイクルでどのように再生されますか?

分類Dev

Dagger2を使用してライブラリモジュールにアプリケーションコンテキストを挿入する

分類Dev

Dagger 2で依存関係を注入するアクティビティに、コンポーネントのすべてのモジュールを設定しないようにするにはどうすればよいですか?

分類Dev

クラスUtilにオブジェクトリソースを挿入します(Daggerを使用)

分類Dev

JavaプロジェクトのIntelliJでDagger2を使用するにはどうすればよいですか?

分類Dev

JavaプロジェクトのIntelliJでDagger2を使用するにはどうすればよいですか?

分類Dev

AndroidでKotlinを使用してDagger2モジュールのコンポーネントの依存関係を取得するにはどうすればよいですか?

分類Dev

Androidプロジェクトで最初からDAGGER依存関係注入を設定するにはどうすればよいですか?

分類Dev

Dagger 2Kotlinオブジェクトにコンテキストを挿入

分類Dev

Dagger 2:ユーザーが入力したパラメーターをオブジェクトに注入する

分類Dev

Dagger2は、@ Named @Providesを依存モジュールに挿入しますか?

分類Dev

Dagger 2に不明な量の不明なモジュールを追加するにはどうすればよいですか?

分類Dev

Dagger : なぜ dagger は別のオブジェクトに依存しないオブジェクトの @inject コンストラクターを必要とするのですか?

分類Dev

Dagger2を使用してサービスに依存関係を注入するにはどうすればよいですか?

分類Dev

不足しているインジェクトをcomplete = falseのモジュールからDagger1からDagger2に移行する方法

分類Dev

Android / JavaでSDKをビルドするときに、Daggerをオプションにするにはどうすればよいですか?

Related 関連記事

  1. 1

    Dagger 2を使用してAndroid優先ジョブキューにオブジェクトを挿入するにはどうすればよいですか?

  2. 2

    AndroidでDagger2を使用して、アクティビティオブジェクトを簡単に挿入するにはどうすればよいですか?

  3. 3

    ViewModelを作成し、dagger 2を使用してリポジトリを挿入するにはどうすればよいですか?

  4. 4

    Dagger 2を使用してサーブレットに注入するにはどうすればよいですか?

  5. 5

    Dagger 2を使用して、複数のコンポーネントを使用して同じオブジェクトに注入するにはどうすればよいですか?

  6. 6

    Dagger2 androidでViewModelのコンストラクターインジェクションを使用するにはどうすればよいですか?

  7. 7

    dagger2を使用してモデルクラスのシングルトンオブジェクトを設定および取得するにはどうすればよいですか?

  8. 8

    Dagger-2:スコープに応じて同じオブジェクトタイプに対して異なるインスタンス化を作成するにはどうすればよいですか?

  9. 9

    dagger.androidを使用して、実行時にバンドルからパラメーターを挿入するにはどうすればよいですか?

  10. 10

    Dagger 2のサブグラフに名前付きコンポーネントを挿入するにはどうすればよいですか?

  11. 11

    Dagger 2 を使用して実行時にフィールドを挿入するにはどうすればよいですか?

  12. 12

    dagger2をAndroidStudioJavaライブラリプロジェクトで動作させるにはどうすればよいですか

  13. 13

    Dagger2で任意の種類のオブジェクトに依存関係を挿入する方法は?

  14. 14

    Dagger 2によって作成されたオブジェクトはAndroidにどのくらい残りますか/ Dagger 2はAndroidアクティビティライフサイクルでどのように再生されますか?

  15. 15

    Dagger2を使用してライブラリモジュールにアプリケーションコンテキストを挿入する

  16. 16

    Dagger 2で依存関係を注入するアクティビティに、コンポーネントのすべてのモジュールを設定しないようにするにはどうすればよいですか?

  17. 17

    クラスUtilにオブジェクトリソースを挿入します(Daggerを使用)

  18. 18

    JavaプロジェクトのIntelliJでDagger2を使用するにはどうすればよいですか?

  19. 19

    JavaプロジェクトのIntelliJでDagger2を使用するにはどうすればよいですか?

  20. 20

    AndroidでKotlinを使用してDagger2モジュールのコンポーネントの依存関係を取得するにはどうすればよいですか?

  21. 21

    Androidプロジェクトで最初からDAGGER依存関係注入を設定するにはどうすればよいですか?

  22. 22

    Dagger 2Kotlinオブジェクトにコンテキストを挿入

  23. 23

    Dagger 2:ユーザーが入力したパラメーターをオブジェクトに注入する

  24. 24

    Dagger2は、@ Named @Providesを依存モジュールに挿入しますか?

  25. 25

    Dagger 2に不明な量の不明なモジュールを追加するにはどうすればよいですか?

  26. 26

    Dagger : なぜ dagger は別のオブジェクトに依存しないオブジェクトの @inject コンストラクターを必要とするのですか?

  27. 27

    Dagger2を使用してサービスに依存関係を注入するにはどうすればよいですか?

  28. 28

    不足しているインジェクトをcomplete = falseのモジュールからDagger1からDagger2に移行する方法

  29. 29

    Android / JavaでSDKをビルドするときに、Daggerをオプションにするにはどうすればよいですか?

ホットタグ

アーカイブ