2017-02-07 1 views
1

Ich habe ein Fragment, das die textViews aus einem Datenobjekt setzt. Dieses Datenobjekt ist anfänglich Null, wenn das Fragment erstellt wird, aber nach einer Netzwerkanforderung aktualisiert wird. Um nun die Textansichten zu aktualisieren, erstelle ich eine Funktion 'updateAll' und übergebe das Fragment an die Callback-Funktion, die die Netzwerkantwort behandelt. Und sobald die Daten auf das Datenobjekt gesetzt sind, rufe ich 'updateAll' von der Fragmentreferenz auf.Ist meine Methode, Textview von einer Volleyantwort zu aktualisieren, der "Android Weg" der richtige Weg?

Beispiel:

class someFragment extends Fragment { 
    private Textview foo; 
    private dataObject obj; 

    ... 
    public onCreate(...) { 
     this.obj = new dataObject(); 
     sendRequestToVolley(..., new VolleyCallbacks(this)); 
    } 
    public onCreateView(...) { 
     ... 
     foo.setText(obj.someVar); 
    } 

    public void updateAll() { 
     foo.setText(obj.someVar); 
    } 
} 


class VolleyCallbacks implements someInterface { 

    public VolleyCallbacks(someFragmment fragment, dataObject obj) { 

    this.obj = obj; 
    this.fragment = fragment; 
    } 

    public onSuccess(Response r) { 
     obj.updateData(r); 
     this.fragment.updateAll(); 
    } 
} 

Ist dies der richtige Weg, dies zu tun? Gibt es eine bessere Methode?

+1

Statt einem 'dataObject' als privates Mitglied des Fragments, könnte man es als Parameter an' updateAll() 'übergeben. Ich würde wahrscheinlich nur die Methode 'update()' nennen, da sie nur die UI mit einem einzigen Wert zu aktualisieren scheint. –

+1

anstelle des Fragments, das Sie in VolleyCallbacks übergeben, können Sie Bezug der Schnittstelle und der dafür verwendeten Schnittstelle weitergeben. da könnte Speicherleck sein. –

+0

Sie können auch die Datenbindungsbibliothek anzeigen. Es ist eine gute Alternative, all dies von Hand zu machen. –

Antwort

1

Sie Code sieht hauptsächlich gut aus. Ich sehe ein Problem: Sie behalten das Fragment als starke Referenz. Es kann ein Speicherleck erzeugen, wenn das Fragment zerstört wird (dh der Benutzer drückt zurück), bevor der Netzwerkanruf abgeschlossen ist. Um dies zu verhindern, sollten Sie eine WeakReference verwenden.

Ich würde auch nicht Ihr Datenobjekt in der Callback-Klasse ändern. Es ist besser, das Fragment modifizieren zu lassen, da er derjenige ist, der den Verweis darauf hält.

Ich würde Ihren Code so umwandeln:

public class SomeFragment extends Fragment { 
    private Textview foo; 
    private dataObject obj; 

    ... 
    public onCreate(...) { 
     this.obj = new dataObject(); 
     sendRequestToVolley(..., new VolleyCallbacks(this)); 
    } 
    public onCreateView(...) { 
     ... 
     refreshTextView(); 
    } 

    private void refreshTextView() { 
     foo.setText(obj.someVar); 
    } 

    void onRequestSuccess(Response r) { 
     obj.updateData(r); 
     refreshTextView(); 
    } 
} 


class VolleyCallbacks implements SomeInterface { 

    private WeakReference<SomeFragment> fragmentWeak; 

    public VolleyCallbacks(SomeFragment fragment) { 
     this.fragmentWeak = new WeakReference<>(fragment); 
    } 

    public onSuccess(Response r) { 
     SomeFragment fragment = this.fragmentWeak.get(); 

     if (fragment != null) { 
      fragment.onRequestSuccess(r); 
     } 
    } 
} 
Verwandte Themen