我正在使用Retrofit的enqueue()方法进行呼叫。 我打电话给我的refreshImages()在我的MainActivity的onCreate() refreshImages()然后调用一个方法refreshImagesIds()这是应该打个电话出去Flickr的API,并返回一个PhotosList对象,然后我会拔出那里的Photos将包含Photo对象列表。 我的问题是,由于某种原因,永远不会调用enqueue()方法中的onResponse() 当我使用调试器时,它会跳过它,而当我将Log语句放入其中时,它们永远不会被写入。 我知道它命中的端点是正确的,因为我可以使用OkHttp的记录器看到它,并且我的POJO都看起来对于返回的数据是正确的。

知道为什么这行不通吗? 以下是我的refreshImagesrefreshImagesId 这些都包含在我的MainAcitivty中并修改类级别的变量。

private void refreshImages() {
        // make api call
        //imageUrls = FlickrServiceManager_withinterface.getKittenImages(8);

        refreshImageIds();

        List<Photo> photos = photosList.getPhotos().getPhoto();
        imageIds = new ArrayList<String>();
        for(Photo photo : photos) {
            Log.d("TAG", "It is pringint imageIds: " + photo.getId());
            imageIds.add(photo.getId());
        }
}

private void refreshImageIds() {
    Retrofit retrofit = Api.getRestAdapter();
    FlickrServiceInterface flickrService = retrofit.create(FlickrServiceInterface.class);
    Call<PhotosList> call = flickrService.getPhotos(API_KEY, FORMAT, "1");
    imageIds = new ArrayList<String>();

    call.enqueue(new Callback<PhotosList>(){
        @Override
        public void onResponse(Call<PhotosList> call, Response<PhotosList> response) {
            photosList = response.body();
        }

        @Override
        public void onFailure(Call<PhotosList> call, Throwable t) {
            // TODO: Clean up
            Log.d("TEMP_TAG", "Call failed");
        }
    });
}

和我的FlickrServiceInterface:

public interface FlickrServiceInterface {

    @GET("?method=flickr.photos.getSizes")
    Call<PhotoSizes> getPhotoSizes(@Query("api_key") String apiKey, @Query("format") String format, @Query("nojsoncallback") String jsonCallback, @Query("photo_id") String photoId);

    @GET("?method=flickr.photos.getRecent")
    Call<PhotosList> getPhotos(@Query("api_key") String apiKey, @Query("format") String format, @Query("nojsoncallback") String jsonCallback);
}

#1楼 票数:2

将您的调用更改为同步改造API:

public static List<String> getImageIds(int size) {
    Call<PhotosList> call = flickrService.getPhotos(apiKey, format, "1");
    photoIds = new ArrayList<String>();

    PhotosList photosList = call.execute().body();
    List<Photo> photos = photosList.getPhotos().getPhoto();

    for(Photo photo : photos) {
        Log.d("TEMP_TAG", "adding photo id to list: " + photo.getId());
        photoIds.add(photo.getId());
    }
    Log.d("TEMP_TAG", "it's getting here too");
    return photoIds;
}

请注意,您需要在AsyncTask上调用此方法

编辑

您也可以继续使用入队,但是您需要提供一个“ onFinish”挂钩,以便知道何时收到数据,然后用数据“通知”客户端:

//interface por communication
public interface ImageIdsCallBack {
   public void onFinish( List<String> photoIds );
}

然后,您将收到此接口并发送数据:

public static List<String> getImageIds(int size, final ImageIdsCallBack callback) {
    Call<PhotosList> call = flickrService.getPhotos(apiKey, format, "1");
    photoIds = new ArrayList<String>();

    call.enqueue(new Callback<PhotosList>(){
        @Override
        public void onResponse(Call<PhotosList> call, Response<PhotosList> response) {
            PhotosList photosList = response.body();
            List<Photo> photos = photosList.getPhotos().getPhoto();

            for(Photo photo : photos) {
                Log.d("TEMP_TAG", "adding photo id to list: " + photo.getId());
                photoIds.add(photo.getId());
            }
            //send the data to the caller
            callback.onFinish(photoIds);
        }

        @Override
        public void onFailure(Call<PhotosList> call, Throwable t) {
            // TODO: Clean up
            Log.d("TEMP_TAG", "Call failed");
        }
    });
    Log.d("TEMP_TAG", "it's getting here too");
    return photoIds;
}

调用方法:

getImageIds( 50 , new ImageIdsCallBack() {
     public void onFinish( List<String> photoIds ) {
         //update UI with photoIds
     }
} );

我通常使用EventBus之类的库来简化它,我真的向您推荐。

#2楼 票数:0

如果我错了,请纠正我,这在主线程上吗? 那将带来不等待响应的问题。

考虑使用async

  ask by intA translate from so

未解决问题?本站智能推荐:

1回复

使用Android的RetroFit解析嵌套的JSON

我正在使用RetroFit以便与我的API通信。 响应是JSON,并且JSON对象(“用户”)之一是字符串。 我想将该字符串解析为JSON。 我有一个响应类: 为用户提供一个类: 但是,由于响应中的“用户”对象是字符串,因此需要首先将其解析为JSON。 我不确定如何执行此操作,
4回复

使用Retrofit使用restapi

我在android studio工作。 我正在尝试使用Rest API 。 现在我正在使用Postman来完成我的工作。 身体的一部分 标题部分 回复 我做了什么? 点播类 UIP 响应类 改造类 然后最后在我的按钮onClick我完成了 调试在调试时我低于日志 我一定错过了一些我不知道的东西任何
2回复

如何使用Retrofit解析使用唯一ID作为键的JSON响应?

我正在编写一个应用程序,以使用其REST API和Square的Retrofit库控制Philips Hue智能灯。 问题是,当我调用/lights ,使用每个光源的id属性作为json响应中的键返回响应(而不是jsonapi响应中典型的光源对象数组,这似乎是预期的)由翻新)。 这是我正
1回复

POST主体JSON使用Retrofit

我正在尝试使用Retrofit库POST一个JSONObject,但是当我在接收端看到请求时,content-length为0 。 在RestService接口中: 它被调用, 我敢肯定的是, registrationBundle ,这是一个JSONObject不为空或空(其他字段当
1回复

无法使用Retrofit通过带有参数的@POST请求解析JSON响应

因此,我正在尝试处理并向我的服务器打印 JSON 响应,但出现错误: java.lang.IllegalStateException:需要一个字符串,但在第 1 行第 1376 列路径 $.scope 处为 BEGIN_ARRAY 这是我的项目的样子: 对象 RetrofitClientInst
2回复

使用Retrofit2从json资源中检索数据

我想用 Retrofit 制作项目POJO 类。 我的 json 资源令人困惑,它有很多项目详细信息。 我怎么做? }
1回复

是什么导致Retrofit忽略方法调用?

我遇到了一种奇怪的行为。 我的应用程序有一个主要活动,该活动由navdrawer布局和默认列表片段组成。 列表片段使用Retrofit客户端来获取内容。 选择列表项目时,将显示详细视图。 在小屏幕上,详细信息视图是通过单独的活动加载的。 该活动还使用Retrofit客户端来获取详细信息
1回复

在Retrofit2中支持@Streaming

因为body().in() (不再)中没有body().in() ,所以此代码在改进2中不起作用: 我发现的唯一方法就是这样。 它是否正确?