使用Retrofit

时间:2015-06-27 14:43:21

标签: java android callback retrofit

我在Android中使用Retrofit的变量范围存在问题:

在MainActivity中,我使用Retrofit将JSON回复转换为POJO(ApiResponse),创建extendedJourney对象并将其添加到extendedJourneyArrayList:

public class MainActivity extends Activity {        
    private ArrayList<ExtendedJourney> extendedJourneyArrayList = new ArrayList<>();
    ...

    getAPIReply(...){
        service.getInfo(..., new getCallback());
    ...}

    private class getCallback implements Callback<ApiResponse> {
        public void success(ApiResponse apiResponse, Response response) {
            try {                    
                consumeApiData(apiResponse);
                }
        ...
        }
    }
    private void consumeApiData(ApiResponse apiResponse){
        ExtendedJourney extendedJourney = new ExtendedJourney(apiResponse, params);
        extendedJourneyArrayList.add(extendedJourney);
    }
    public void getData(View view){
        getAPIReply(...);
        //Do stuff with the extendedJourneyArrayList  
    }

Inside consumeApiData()一切正常,即从apiResponse和其他参数正确创建extendedJourney对象,并使用新的extendedJourney正确更新extendedJourneyArrayList。

但是,在getData(View视图)中,extendedJourneyArrayList为空。

如何解决这个问题?谢谢:D

2 个答案:

答案 0 :(得分:1)

您正在进行异步通话 这意味着,在调用 service.getInfo(...,new getCallback()); 之后,流程会继续正常进行,直到它被回调中断为止。  因此,在收到响应之前,您在 getData(View v)中的代码可能正在执行。

所以你应该用回调上的数据做你想做的事情(例如在数据添加到 consumeApiData(..)之后列表),或执行同步请求(您必须在单独的线程中执行)。

答案 1 :(得分:0)

感谢@Kushtrim的回答。为了解决我使用AsyncTask执行同步请求的问题,代码现在看起来像这样:

public class MainActivity extends Activity {        
    private ArrayList<ExtendedJourney> extendedJourneyArrayList = new ArrayList<>();
...
    public void getData(View view){
        for(int i = 0; i < NUM_REQUESTS; i++){
            new getAPIReply().execute(params);
        }

    }

    private class getAPIReply extends AsyncTask<Params, Void, ApiResponse>{
        @Override
        protected ApiResponse doInBackground(Coords[] coords) {
            return service.getRouteInfo(params);
        }
        @Override
        protected void onPostExecute(ApiResponse apiResponse){
            try {
                consumeApiData(apiResponse);
            } catch (JSONException e) {...}           
    } 

    private void consumeApiData(ApiResponse apiResponse) throws JSONException{
        ExtendedJourney extendedJourney = new ExtendedJourney(apiResponse, params);
        extendedJourneyArrayList.add(extendedJourney);
        if(extendedJourneyArrayList.size() == NUM_REQUESTS) {
              //Do stuff
        }
    }