【问题标题】:enqueue multiple GET request when using nested retrofit 2.0使用嵌套改造 2.0 时将多个 GET 请求排入队列
【发布时间】:2016-07-28 11:01:23
【问题描述】:

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

我的代码:-

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() 入队方法中)不能正常工作。没有显示任何错误,控制台中的成功消息。谁能帮我解决这个问题。

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

【问题讨论】:

  • 您是否运行调试器以确保 response.isSuccessful 为真?
  • @Ben:是的,它返回了我的成功状态,并且还转到了我的 secondRequest() 函数。但我的问题是它没有执行 call_second.enqueue(.....) 方法。
  • 对不起,我真的很难过一切对我来说都是正确的。我有类似的代码,唯一不同的是我的回调不是匿名内部类,所以即使不应该这样做,也可能会有所不同。

标签: android request retrofit2


【解决方案1】:

你犯了一个错误,当你使用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);
    } 
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 2018-09-01
    • 2020-01-24
    • 1970-01-01
    • 2019-08-21
    相关资源
    最近更新 更多