2016-12-20 2 views
1

I Helper-Klasse im Android Studio Service Activity okhttp3 wie Wert zurückgeben von Asynchron-Anruf erhält

Mein Funktionsaufruf in Aktivitätsklasse

Helper helper = new Helper(); 
helper.getLastId(); 
//I want to get method to return lastId and then manipulate with the data 

Wie kann ich Methode Rückgabewert

public void getLastId() 
{ 
    //init OkHttpClient 
    OkHttpClient client = new OkHttpClient(); 

    //backend url 
    Request request = new Request.Builder() 
      .url("http://192.168.1.102:8080/aquabackend/public/customers/lastid") 
      .build(); 


    client.newCall(request).enqueue(new Callback() { 
     @Override 
     public void onFailure(Call call, IOException e) { 

     } 

     @Override 
     public void onResponse(Call call, Response response) throws IOException { 

      String jsonData = response.body().string(); 

      try { 
       JSONObject jobject = new JSONObject(jsonData); 
       String id = jobject.getString("id"); 

       //increment current id +1 
       String last_id = String.valueOf(Integer.parseInt(id)+1); 
       Log.i("new id", last_id); 

      } catch (Exception e) { 
        e.printStackTrace(); 
      } 
      //Log.i("ok", response.body().string()); 
     } 
    }); 
bin die Umsetzung von der ID?

Antwort

1

Da es ein asynchroner Prozess ist, werden Sie nicht selbst in der Lage einen Wert aus dem Verfahren zurück. Sie können jedoch einen Rückruf verwenden, um den Wert anzugeben, wenn der asynchrone Prozess abgeschlossen wurde. Im Folgenden finden Sie ein Beispiel dafür, wie Sie dies tun könnten.

public interface GetLastIdCallback { 
    void lastId(String id); 
} 

Sie würden getLastId wie folgt ändern:

public void getLastId(GetLastIdCallback idCallback) { 
    ... 
    String last_id = String.valueOf(Integer.parseInt(id)+1); 
    idCallback.lastId(last_id); 
    ... 

} 

Ihre Helper Klasse Nutzung nun wie folgt aussehen:

Helper helper = new Helper(); 
helper.getLastId(new GetLastIdCallback() { 
    @Override 
    public void lastId(String id) { 
     // Do something with your id 
    } 
}); 

Ich würde vorschlagen, Ihr Rückruf ein bisschen mehr Generika machen als Ich habe oben vorgeschlagen. Es könnte so aussehen:

public interface GenericCallback<T> { 
    void onValue(T value); 
} 

... 

Helper helper = new Helper(); 
helper.getLastId(new GenericCallback<String>() { 
    @Override 
    public void onValue(String value) { 
     // Do something 
    } 
}); 

Wenn Sie eine Schnittstelle wie oben verwendet haben, könnten Sie mit jedem Rückgabetyp arbeiten.

+0

Das hat funktioniert und Danke für die generische Lösung! – mydreamadsl

0

Erstellen Sie eine Schnittstelle.

public interface Result{ 
    void getResult(String id); 
} 

Jetzt übergeben Schnittstelle zu Methode als Parameter.

Helper helper = new Helper(); 
     helper.getLastId(new Result(){ 
     @Override 
     void getResult(String id){ 

     } 
}); 

und in Ihrer Methode:

public void getLastId(final Result result) 
{ 
    //init OkHttpClient 
    OkHttpClient client = new OkHttpClient(); 

    //backend url 
    Request request = new Request.Builder() 
      .url("http://192.168.1.102:8080/aquabackend/public/customers/lastid") 
      .build(); 


    client.newCall(request).enqueue(new Callback() { 
     @Override 
     public void onFailure(Call call, IOException e) { 

     } 

     @Override 
     public void onResponse(Call call, Response response) throws IOException { 

      String jsonData = response.body().string(); 

      try { 
       JSONObject jobject = new JSONObject(jsonData); 
       String id = jobject.getString("id"); 

       //increment current id +1 
       String last_id = String.valueOf(Integer.parseInt(id)+1); 
       Log.i("new id", last_id); 
       result.getResult(last_id); 

      } catch (Exception e) { 
        e.printStackTrace(); 
      } 
      //Log.i("ok", response.body().string()); 
     } 
    }); 
0

Sie haben interface für sie zu schaffen.

public interface getResponse { 

    void getJsonResponse(final String id); 

} 

im Code:

public void getLastId(fianl getResponse response) 
{ 
    //init OkHttpClient 
    OkHttpClient client = new OkHttpClient(); 

    //backend url 
    Request request = new Request.Builder() 
      .url("http://192.168.1.102:8080/aquabackend/public/customers/lastid") 
      .build(); 


    client.newCall(request).enqueue(new Callback() { 
     @Override 
     public void onFailure(Call call, IOException e) { 

     } 

     @Override 
     public void onResponse(Call call, Response response) throws IOException { 

      String jsonData = response.body().string(); 

      try { 
       JSONObject jobject = new JSONObject(jsonData); 
       String id = jobject.getString("id"); 

       //increment current id +1 
       String last_id = String.valueOf(Integer.parseInt(id)+1); 
       Log.i("new id", last_id); 
if(response!=null){ 
response.getJsonResponse(last_id) 
} 
      } catch (Exception e) { 
        e.printStackTrace(); 
      } 
      //Log.i("ok", response.body().string()); 
     } 
    }); 

In Aktivität:

public class HomeActivity extends AppCompatActivity { 
@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

    Helper helper = new Helper(); 
     helper.getLastId(new getResponse(){ 
      @Override 
      void getJsonResponse(String id){ 

      } 
    }); 
}} 
    } 
+0

Wo erstelle ich eine Schnittstelle? In meiner Helferklasse? – mydreamadsl

+0

Es ist getrennt. Keine Notwendigkeit, in der Helper-Klasse –

+0

zu erstellen, heißt es Error: (181, 18) error: getJsonResponse (String) in kann getJsonResponse (String) in getResponse nicht implementieren versuchen, schwächer zuzuweisen Zugriffsrechte; war öffentlich – mydreamadsl