我在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
答案 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
}
}