2016-12-20 7 views
1

Я реализую класс Helper в Android студии обслуживания деятельностиokhttp3 как вернуть значение из асинхронной ПОЛУЧИТЬ называют

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()); 
     } 
    }); 

Мой вызов функции в классе деятельности

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

Как я могу сделать метод возвращаемого значения идентификатора?

ответ

1

Как это асинхронный процесс, который вы не сможете вернуть значение из самого метода. Однако вы можете использовать обратный вызов, чтобы предоставить вам значение, когда асинхронный процесс завершен. Ниже приведен пример того, как вы можете это сделать.

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

Вы бы изменить getLastId следующим образом:

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

} 

Ваше использование класса Helper будет выглядеть следующим образом:

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

Я бы предложил сделать ваш обратный вызов немного больше общего, чем Я предложил выше. Это может выглядеть так:

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 
    } 
}); 

Если вы использовали интерфейс, подобный выше, вы могли бы работать с любым типом возврата.

+0

Это сработало и спасибо за универсальное решение! – mydreamadsl

0

Создать интерфейс.

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

Теперь передайте интерфейс в качестве параметра.

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

     } 
}); 

И В вашем методе:

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

Вы должны создать interface для него.

public interface getResponse { 

    void getJsonResponse(final String id); 

} 

В вашем коде:

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()); 
     } 
    }); 

В деятельности:

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

Где я могу создать интерфейс? В моем классе помощников? – mydreamadsl

+0

Отдельно. Нет необходимости создавать в классе Helper –

+0

это говорит Ошибка: (181, 18) error: getJsonResponse (String) в не может реализовать getJsonResponse (String) в getResponse , пытаясь назначить более слабый привилегии доступа; было опубликовано – mydreamadsl