2017-08-17 3 views
0

Ich habe zwei Klassen, die eine Klasse verwenden wird, die Volley ruft und die onResponse überschrieben hat. Es gibt einen Code, der in der onReponse genau gleich ist, außer für zwei Zeilen. Was ist der beste Weg, einen Super auf die Antwort zu nennen, aber immer noch die zusätzlichen zwei Zeilen auszuführen. Hier ist, was ich meine:Android Volley Zusammenfassung onResponse

Class A { 
    .... 
    Uploader uploader = new Uploader(); 
    uploader.startUpload(context, path, data); 

    // I know this can't be done but showing what I want 
    uploader.onResponse(String response) { 
     super(response); 
     ... 
     call to extra code 
    } 
} 

Das Gleiche gilt für Klasse B aber zusätzlichen Code unterscheidet

public class Uploader implements Response.Listener<String> { 
    public Uploader() { } 

    public void upLoad(final Context context, String path, String data) { 
     .... build request and then make call to start request 
    } 

    @Override 
    public void onResponse(String response) { 
     ... Doing something common for both A and B Classes 
    } 
} 

Antwort

1

Sie könnten eine abstrakte Klasse extrahieren:

abstract class MyReponseListener implements Response.Listener<String> { 

    @Override 
    public void onResponse(String response) { 
     //the two lines of common code you want 
    } 
} 

und machen Sie Ihre Uploader erweitern Zusammenfassung MyResponseListener:

class Uploader extends MyResponseListener { 
    public Uploader() { } 

    public void upLoad(final Context context, String path, String data) { 

    } 

    @Override 
    public void onResponse(String response) { 
     super(response); 
    } 
} 

Wenn Sie dann ein anderes Verhalten für die Konsumenten von Uploader wollten, können Sie dann Unterklassen als Abhängigkeiten wie unten angeben.

ClassA Refactoring die Abhängigkeit von Uploader zu nehmen:

public ClassA(Uploader uploader) { 
    this.uploader = uploader; 
} 

Subclassing Uploader:

Uploader classAUploader = new Uploader() { 
    @Override 
    public void onResponse(String response) { 
     super.onResponse(response); 
     //your code for the special handling in ClassA 
    } 
}; 

es als Abhängigkeit Passing für ClassA:

ClassA classA = new ClassA(classAUploader); 

Eine bessere Lösung könnte verwenden zusammensetzen Statt Vererbung. So Uploaderhat ein Response.Listener<String> eher als ist ein Response.Listener<String>. Dann können die verschiedenen Response.Listener<String> als Abhängigkeiten für den Uploader wie oben angegeben übergeben werden. Wenn Sie diese Technik verwenden, brauchen Sie die Unterklasse Uploader nicht einfach zu ändern, um das Verhalten für die Response.Listener zu ändern.

+0

der Aufruf von Super ist in der Uploader-Klasse in rot, ich habe die Unterklasse ein und das funktioniert wie ein Charme. – JPM

+0

@JPM Ich bin froh, dass es geholfen hat –