0

Ich arbeite an einer Android-App, die eine Mischung aus Java und Native-Code ist. Ich stehe vor einem Problem im Zusammenhang mit der Synchronisierung verschiedener Thread-Daten. Hier ist eine Szenerie.Sync der CreateView von mehreren Fragmenten

In meiner Haupttätigkeit habe ich eine Listenansicht. Wenn ich ein Element in der Listenansicht auswähle, muss ich 3 Fragmente erstellen, und ich muss auch ein Modell auf der nativen Seite erstellen, das Daten für verschiedene Fragmente bereitstellt. Das Ergebnis der Arbeit auf der nativen Seite wird mir einige Details über den TextView-Wert und Schaltflächenstatus in den drei Fragmenten geben. Also in der onclick-Handler der Listview, ich erstellt einen Thread t2, der die auf der nativen Seite mit JNI-Aufruf startet und auf dem UI-Thread t1, habe ich meine Fragmente erstellt. Wenn der t2 fertig ist, sendet er eine lokale Absicht, so dass die Aktivität weiß, dass der native Code bereit ist. Bei der Behandlung dieser Absicht muss ich die UIs von Fragmenten wie Schaltflächenzuständen und Textansichten aktualisieren. Aber ich stehe hier vor einer Race-Bedingung, dass manchmal CreateView der Fragmente komplett ist und manchmal nicht. Daher kann ich meine Fragmente nicht richtig in der Handhabung der Absicht aktualisieren.

So brauche ich einen Mechanismus, wo in der Behandlung der Absicht ich auf die CreateView für alle Fragmente zu vervollständigen warten und dann kann ich UI der Fragmente aktualisieren. In Zukunft kann ich 1-2 weitere Fragmente haben.

Also was ist der beste skalierbare Mechanismus, wo ich auf CreateView komplette Aktion des Fragments warten kann und sie dann aktualisieren kann. Beachten Sie, dass jedes der Fragmente unabhängig voneinander ist.

Antwort

0

Wenn ich Ihre Frage richtig verstanden habe, brauchen Sie grundsätzlich einen Weg für Ihre Aktivität, um zu wissen, ob alle Fragmente mit createview fertig sind und dann die Absicht behandeln.

Eine relativ einfache Art und Weise ist eine einfache Schnittstelle FragmentCallBack machen, die von MainActivity verwendet werden kann, den Überblick über alle Fragmente zu halten, die

public Interface FragmentCallBack { 
    public void onFragmentCreated(Fragment f) 
} 

Lassen Sie Ihre Aktivität diese Schnittstelle implementieren erstellt wurden, wo in sie nachvollziehen können, welches Fragment erstellt wird. Auch in Aktivität hat eine Variable, die die empfangenen Absicht und einen boolean zu speichern, um Kurs zu halten, ob Absicht

private Intent recievedIntent 
private boolean isIntentRecieved 
List<Fragment> createdFragments 

Jetzt implementieren die Funktionen Fragment Abschluss und Erhalt des Vorsatzes

@Override 
public void onFragmentCreated(Fragment f) { 
    createdFragments.add(f) 
    if (isIntentRecieved) { 
    //handle the intent for this fragment 
    } 
} 

@Override 
public void onRecieve(Context context, Intent intent) { 
    isIntentRecieved = true 
    recievedIntent = intent 
    for (Fragment f: createdFragments) { 
    //handle the intent 
    } 
} 

Jetzt erhalten wird, um die Änderung zu handhaben erforderlich für Ihre Fragmente zu informieren, werden die Aktivität von create Abschluss

@Override 
public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
//do createview stuff 
((FragmentCallback) (getActivity())).onFragmentCreated(this); 
} 

So, jetzt Ihre Absicht Aufgaben im Zusammenhang mit Ihrem Fragmente erfolgen s nur nach Fertigstellung

Eine andere Möglichkeit wäre, jedes Fragment die Absicht einzeln behandeln zu lassen, jedoch in Ihrem Thread die Übertragung von Absicht verzögern, bis alle Fragmente erstellt sind. Um dies zu tun, können Sie Ihrer Aktivität die Anzahl der Fragmente überlassen, die sie für den Dienst erstellen möchte (der den systemeigenen Aufruf usw. ausführt), während Sie sie erstellen. Wenn nun eine Aktivität ein Fragment vervollständigt (wie im vorherigen Beispiel), informiert sie den Dienst darüber und der Dienst erhöht den Zähler. Der Service verzögert die Übertragung der Absicht, bis die Anzahl erreicht ist. Natürlich muss der Zähler synchronisiert werden, um den Wettlauf zu vermeiden

Verwandte Themen