Ich versuche, mithilfe von Dagger Retrofit 2 und Android Priority Job Queue 2.Wie injiziere ich ein Objekt in die Android Priority Job Queue mit Dagger 2?
Es ist wahrscheinlich, ich verwende hier das falsche Muster zu integrieren (Ich bin neu in Java und Android), aber ich versuche, Zugriff auf eine von Dagger erstellte Retrofit-Instanz von einem Objekt, das serialisiert und dann vor der Ausführung deserialisiert wird (Android-Jobwarteschlange serialisiert Jobs, die auf Festplatte gespeichert werden). Die Retrofit-Instanz wird von einer Application Dagger-Komponente erstellt, da ich SharedPreferences in einer ihrer Abhängigkeiten verwende.
Ich kann Retrofit nicht an den Job übergeben, wenn er erstellt wird, da Retrofit selbst nicht serialisiert werden kann.
Die Anwendung kann auch nicht serialisiert werden, daher kann ich die Application Dagger-Komponente nicht vom Job referenzieren, wenn sie ausgeführt wird (da ich nicht mit ((MyApplication) myApplication).component().inject(this);
injizieren kann), weil das Application-Objekt nicht existiert im deserialisierten Job.)
Ich möchte die Retrofit-Instanz verwenden, die von der restlichen App für Effizienz verwendet wird, anstatt eine andere Instanz nur für den Job zu erstellen. Ist es überhaupt möglich?
Ich bin mir nicht sicher, ob die Verwendung von Provider<T>
oder einer Factory helfen könnte, weil das im Moment nicht mein Verständnis ist, aber ich würde einen Hinweis darauf lieben, wie man Dinge strukturiert, wenn das der Fall ist!
BEARBEITEN: So erstellen Sie einen Auftrag mit Android Priority Job Queue. Ich habe eine Probe modifiziert, um anzuzeigen, wie die Spritze funktionieren soll. Der Auftrag wird auf onAdded()
serialisiert und deserialisiert, bevor es mit onRun()
laufen gelassen:
// 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
}
}
Im Allgemeinen serialisieren Sie normalerweise einfache Klassen. Warum sollten sie überhaupt Zugriff auf die Retrofit-Instanz haben? Wird eine Manager/Presenter/Handler-Klasse hinzugefügt, die die Backend-Aufrufe ausführt und das Modell (Ihre serialisierte Klasse) keine Option enthält? –
@DavidMedenjak Ich habe einen Beispielcode hinzugefügt, um zu zeigen, was mit der Android Priority Job Queue passiert. Ich muss meinen Dienst (oder Retrofit) von dem Job aufrufen, wenn er ausgeführt wird. – snafu109
Die Readme-Datei der Bibliothek zeigt, dass DI durch Hinzufügen eines Injektors unterstützt wird, haben Sie das schon versucht? Das scheint der sauberste Weg zu sein. –