как проверить, был ли вызов Retrofit API успешным в Android - PullRequest
0 голосов
/ 24 сентября 2018

вот мой код:
этим методом я отправляю некоторые данные на мой сервер API
, если данные получены успешно success переменная будет истинной внутри onResponse метод

private boolean success=false;

public boolean commit(){

        requestHandler.insertFields(tableName,values).enqueue(new Callback<DatabaseModel>() {
            @Override
            public void onResponse(Call<DatabaseModel> call,
                                   Response<DatabaseModel> response) {
                if (response.isSuccessful())
                Log.i("debug8","result is:"+response.body().toString());
                else
                    Log.e("debug8","error in server response:"+response.toString());


                success=true;

            }

            @Override
            public void onFailure(Call<DatabaseModel> call, Throwable t) {
                Log.e("tempo",t.getMessage());
            }
        });

        return success;//returns false before finishing the request
}

и в своей деятельности я хочу проверить результат следующим образом:

        Database db=new Database("cars");
    db.put("field1","val1")
            .put("field2","val2");

    if(db.commit())
        Toast.makeText(this, "data inserted successfully", Toast.LENGTH_SHORT).show();
    else
        Toast.makeText(this, "failed to insert new record", Toast.LENGTH_SHORT).show();

проблема состоит в том, что всегда результат метода фиксации равен false, поскольку код возвращает false до того, как метод ретрофитной очереди завершит свою работу

это хорошая идея сделать пользовательский слушатель или что-то подобное для этого?
заранее спасибо

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

происходит следующее: метод запроса является асинхронной задачей, когда вы вызываете его, он начинает работать на второй плоскости, и ваша функция фиксации продолжает свой поток синхронизации, который возвращается (ложное значение в этомcase).

Вы можете попробовать 2 вещи:

  1. как-то так,

    public XX(whatever correspond) commit(){
    
    return requestHandler.insertFields(tableName,values).enqueue(new Callback<DatabaseModel>() {
        @Override
        public void onResponse(Call<DatabaseModel> call,
                               Response<DatabaseModel> response) {
            if (response.isSuccessful())
            Log.i("debug8","result is:"+response.body().toString());
            else
                Log.e("debug8","error in server response:"+response.toString());
    
    
             return true;
    
        }
    
        @Override
        public void onFailure(Call<DatabaseModel> call, Throwable t) {
            Log.e("tempo",t.getMessage());   return false;
          }
    });
    

    }

и исправьте if на другой стороне

или так

public void commit(){

requestHandler.insertFields(tableName,values).enqueue(new Callback<DatabaseModel>() {
    @Override
    public void onResponse(Call<DatabaseModel> call,
                           Response<DatabaseModel> response) {
        if (response.isSuccessful())
        Log.i("debug8","result is:"+response.body().toString());
        else
            Log.e("debug8","error in server response:"+response.toString());
         Toast.makeText(this, "data inserted successfully", Toast.LENGTH_SHORT).show();

    }

    @Override
    public void onFailure(Call<DatabaseModel> call, Throwable t) {
        Toast.makeText(this, "failed to insert new record", Toast.LENGTH_SHORT).show();       
              }
        });}
0 голосов
/ 24 сентября 2018

Да, вам нужно создать слушатель для этого, потому что эти вызовы происходят асинхронно, поэтому он всегда возвращает false.

. Вы можете создать interface, как показано ниже.

public interface RetrofitResponseListener {

    void onSuccess();

    void onFailure();
}

И передайте это как аргумент в вашем методе.

public void commit(final RetrofitResponseListener retrofitResponseListener) {

        requestHandler.insertFields(tableName, values).enqueue(new Callback<DatabaseModel>() {
            @Override
            public void onResponse(Call<DatabaseModel> call,
                                   Response<DatabaseModel> response) {
                if (response.isSuccessful())
                    retrofitResponseListener.onSuccess();
                else
                    retrofitResponseListener.onFailure();

            }

            @Override
            public void onFailure(Call<DatabaseModel> call, Throwable t) {
                retrofitResponseListener.onFailure();
            }
        });
    }

И, наконец, используйте это там, где вам нравится:

private void setListener() {
        commit(new RetrofitResponseListener() {
            @Override
            public void onSuccess() {

            }

            @Override
            public void onFailure() {

            }
        });
    } 

Теперь делайте все, что вы хотите onSuccess или onFailure.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...