2016-05-10 2 views
1

Ich habe diese beiden Methoden erklärt:Wie man einen Wert von einer inneren Schnittstelle in Methode zurückgibt?

private Result mResult; 

private void setResult(Result result){ 
    this.mResult = result; 
} 

private Result getResult(){ 
    new Executor(new OnResultListener() { 
     @Override 
     public void onResult(Result result) { 
      setResult(result); 
     } 
    }).execute(); 
    return mResult; 
} 

Im über eine Schnittstelle, während ein AsyncTask ausgeführt wird. Was mein Problem ist, ist, dass ich das Objekt Result der Methode onResult als ein Objekt an die Methode getResult() zurückgeben möchte.

Wie oben gezeigt, habe ich versucht, es durch einen Setter zu setzen, aber es scheint, dass dies nicht funktioniert.

Wie kann ich das schaffen? Vielen Dank im Voraus!

+0

Sie können einfach nicht tun. Sie können Handler/LocalBroadcast/EventBus verwenden, um eine Nachricht asynchron zu übergeben. Eine andere Möglichkeit wäre, eine Klasse zu erstellen, die AsyncTask erweitert. Wenn dann der Prozess beendet ist, rufen Sie eine Callback-Methode auf, um die Änderungen oder neuen Daten zu aktualisieren. –

+0

Haben Sie versucht, die mResult-Kennung in 'static' zu ändern? Und nenn es einfach so in 'onResult':' mResult = result; '? Wenn das nicht funktioniert, was ist mit einer Schnittstelle? –

+0

Sie haben einen asynchronen Rückruf und möchten das Ergebnis von einem blockierenden Getter erhalten. Ich denke, du solltest deine Code Logik überprüfen. Was willst du wirklich erreichen? Ich denke, Ihr Problem könnte einfach durch die Implementierung einer Schnittstelle gelöst werden – FrenchFalcon

Antwort

1

Sie könnten eine Instanz von OnResultListener als Teil des Konstruktors Ihrer AsyncTask angeben, den der Aufrufer implementieren muss. Z.B.

private Result mResult; 
private OnResultListener mListener; 
private void setResult(Result result, OnResultListener listener){ 
    this.mResult = result; 
    mListener = listener; 
} 


private Result getResult(){ 
    new Executor(new OnResultListener() { 
     @Override 
     public void onResult(Result result) { 
      if (mListener != null) { 
       mListener.onResult(result); 
      } 
      setResult(result); 
     } 
    }).execute(); 
    return mResult; 
} 

oder Sie können direkt liefern mListener-new Executor

+0

Ich verstehe nicht ruhig Ihren Weg .. Sie rufen die setResult-Methode mit einem Parameter, aber Sie haben zwei .. – Kanellis

+0

Sie hatten den ersten Parameter. Sein Zweck entzieht sich mir. – Blackbelt

2

Sie haben zwei Möglichkeiten. Die schlechte ist, zu warten, bis der neue Thread fertig ist. lass uns das nicht tun). der bessere Weg ist es, einen Rückruf zu verwenden für:

public static interface OnResultCallback { 
    void onResult(Result result); 
} 

private void getResult(final OnResultCallback callback){ 
    new Executor(new OnResultListener() { 
     @Override 
     public void onResult(Result result) { 
      setResult(result); 
      callback.onResult(result); 
     } 
    }).execute(); 
} 
+0

Danke für die Antwort! Ich verstehe, aber wie kann ich warten, bis der Thread fertig ist? – Kanellis

+0

Und wie bekomme ich das Ergebnis dann von der Callback-Schnittstelle? – Kanellis

+0

@Kanellis attache bitte vollen Quellcode der 'async Aufgabe'. Ich bin mir nicht ganz sicher, wie Sie es neben "Executor" verwenden –

0
public class CustomOnResultListener extends OnResultListener{ 
Callback callback ; 
public CustomOnResultListener(Callback callback){} 
    this.callback =callback; // use this callback to send result 
} 
public interface Callback{public void onCallback(Result result);}; 
Verwandte Themen