如何在Android中检查Retrofit API调用是否成功

Win*_*er1 2 android retrofit

这是我的代码:通过这种方法, 如果数据成功接收变量将在方法内为 true
,我将一些数据发送到我的 API 服务器
successonResponse

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
}
Run Code Online (Sandbox Code Playgroud)

在我的活动中我想检查这样的结果:

        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();
Run Code Online (Sandbox Code Playgroud)

问题是提交方法结果总是 false,因为代码在改进排队方法完成其工作之前返回 false

制作一个自定义侦听器或类似的东西来执行此操作是一个好主意吗?
提前致谢

May*_*jra 5

是的,您需要为此创建侦听器,因为这些调用是异步发生的,这就是它始终返回的原因false

您可以创建interface如下所示的内容。

public interface RetrofitResponseListener {

    void onSuccess();

    void onFailure();
}
Run Code Online (Sandbox Code Playgroud)

并将其作为参数传递到您的方法中。

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();
            }
        });
    }
Run Code Online (Sandbox Code Playgroud)

最后在你喜欢的地方使用它:

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

            }

            @Override
            public void onFailure() {

            }
        });
    } 
Run Code Online (Sandbox Code Playgroud)

现在做任何你想做的事onSuccess或者onFailure