使用嵌套改造 2.0 时排队多个 GET 请求

enqueue multiple GET request when using nested retrofit 2.0

我正在使用 Retrofit 2.0 通过嵌套多个请求进行 api 调用。所有 api 都可以单独使用。 但是当我嵌套所有改造时,第一个请求完美执行但是之后当我注册第二个请求时它不是 enqueue 方法中的回调(即它直接返回 null 而没有插入 enqueue's 内部方法,如 onResponse, onFailure)

我的代码:-

public class Main2Activity extends AppCompatActivity {
    Gson gson;
    JSONObject jsonResult=null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        gson=new GsonBuilder().create();
        firstRequest(); //-- First retrofit request
    }


    private void firstRequest() {
        Retrofit retrofit=new Retrofit.Builder().baseUrl(getResources().getString(R.string.Api_Url)).addConverterFactory(GsonConverterFactory.create(gson)).build();
        CityRetailsApi service = retrofit.create(CityRetailsApi.class);
        Call call_first= service.getMainCatFlag();

        call_first.enqueue(new Callback() {
            @Override
            public void onResponse(Call call, Response response) {        
                Log.d("MainActivity", "Status Code = " + response.code());
                if (response.isSuccessful()){
                    MainCatFlag result = (MainCatFlag) response.body(); //-- Get First request response                    
                    JSONObject json2nd = secondRequest(); //-- Second request
                }
            }

            @Override
            public void onFailure(Call call, Throwable t) {
                Log.d("MainActivity", "Error");
            }
        });
    }

    private JSONObject secondRequest() {
        try {            
            Retrofit retrofit=new Retrofit.Builder().baseUrl(getResources().getString(R.string.Api_Url)).addConverterFactory(GsonConverterFactory.create(gson)).build();
            CityRetailsApi service = retrofit.create(CityRetailsApi.class);
            Call call_second= service.getMainCat();

            call_second.enqueue(new Callback() {
                @Override
                public void onResponse(Call call2, Response response1) {                    
                    Log.d("MainActivity", "Status Code = " + response1.code());
                    if (response1.isSuccessful()) {                        
                        MainCat result = (MainCat) response1.body();
                        if (result.getSuccess()==1)
                        {
                            try {
                                jsonResult= new JSONObject(new Gson().toJson(result));
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }

                @Override
                public void onFailure(Call call, Throwable t) {
                    Log.d("MainActivity", "Error");
                }
            });
        }catch (Exception e){
            Log.d("MainActivity", "Error= " + e);
        }
        return jsonResult;
    }
} 

在上面的代码中 firstRequest() 正确执行并证明响应,但 secondRequest(在 firstRequest() 入队方法中)无法正常工作。控制台中未显示任何错误、成功消息。谁能帮我解决这个问题。

如果我的代码有任何问题,请告诉我。 提前谢谢你。

你犯了一个错误,当你使用retrofit enquene时,它被异步调用,所以你无法在回调方法之外获取结果!

因此,您应该像这样在 onResponse 方法中处理您的结果:

private void secondRequest() {
    try {             
        call_second.enqueue(new Callback() {
            @Override 
            public void onResponse(Call call2, Response response1) {                    
                Log.d("MainActivity", "Status Code = " + response1.code());
                if (response1.isSuccessful()) {                        
                    MainCat result = (MainCat) response1.body();
                    if (result.getSuccess()==1)
                    { 
                        try { 
                            jsonResult= new JSONObject(new Gson().toJson(result));

                            // process your jsonResult here
                            ...

                        } catch (JSONException e) {
                            e.printStackTrace();
                        } 
                    } 
                } 
            } 

            @Override 
            public void onFailure(Call call, Throwable t) {
                Log.d("MainActivity", "Error");
            } 
        }); 
    }catch (Exception e){
        Log.d("MainActivity", "Error= " + e);
    } 
}