私はそれは私が(私は、JavaとAndroidに新たなんだ)ここで間違ったパターンを使用していますが、私はしようとしている可能性がありますダガー2にDagger 2でAndroid優先ジョブキューにオブジェクトを挿入するにはどうすればよいですか?
を使用してレトロフィット2とAndroid優先ジョブキューを統合しようとしていますDaggerによって作成されたRetrofitインスタンスにシリアル化され、実行前に直列化解除されるオブジェクトからアクセスします(Android Job Queueはディスクに永続化されたジョブをシリアル化します)。 Retrofitインスタンスは、Application Daggerコンポーネントによって作成されます。これは、依存関係の1つでSharedPreferencesを使用しているためです。
Retrofit自体をシリアル化できないため、作成時にRetrofitをジョブに渡すことができません。
アプリケーションもシリアル化できないため、実行時にApplication Daggerコンポーネントをジョブから参照することはできません(アプリケーションオブジェクトが存在しないため、アクティビティから実行できるように((MyApplication) myApplication).component().inject(this);
を挿入できません)。 )
私はジョブのためだけに別のインスタンスを作成するのではなく、残りのアプリケーションで使用するRetrofitインスタンスを効率的に使用したいと考えています。それも可能ですか?
Provider<T>
または工場を使用しているかどうかわかりませんが、それは私の理解の範囲を超えているので助けになるかもしれませんが、そうした場合には構造物の仕方についてのヒントが大好きです。
EDIT:この方法で、Android優先度ジョブキューを使用してジョブを作成します。私は、注射がどのように機能しているかを示すためにサンプルを修正しました。それはonRun()
で実行れる前の仕事はonAdded()
にシリアライズとデシリアライズされます。
// 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
}
}
一般的には、モデル/シンプルクラスをシリアル化します。 Retrofitインスタンスにアクセスする必要があるのはなぜですか? Manager/Presenter/Handlerクラスを追加してバックエンド呼び出しを行い、モデル(シリアル化されたクラス)をオプションなしに保持していますか? –
@DavidMedenjak Androidの優先度ジョブキューで何が起こるかを示すサンプルコードを追加しました。それが実行されると、私のサービス(またはRetrofit)を仕事から呼び出す必要があります。 – snafu109
ライブラリのreadmeには、インジェクタを追加してDIをサポートしていることが示されています。既に試しましたか?これは最もきれいな方法のように思えます –