json 我的Retrofitcall.enque()方法被完全跳过了,不知道为什么

pgx2nnw8  于 2023-05-19  发布在  其他
关注(0)|答案(3)|浏览(129)

我正在使用Retrofit的enqueue()方法进行调用。我在我的MainActivity的onCreate()中调用我的refreshImages()refreshImages()然后调用一个方法refreshImagesIds(),该方法应该调用Flickr的API并返回一个PhotosList对象,然后我将从那里拉出Photos,它将包含Photo对象的列表。我的问题是,由于某种原因,我的enqueue()方法中的onResponse()永远不会被调用。当我使用调试器时,它会跳过它,当我将Log语句放入其中时,它们永远不会被写出来。我知道它所访问的端点是正确的,因为我可以使用OkHttp的记录器看到它,并且我的POJO对于返回的数据来说都是正确的。
知道为什么这不管用吗下面是我的refreshImagesrefreshImagesId。这些都包含在我的MainActivty和修改类级变量中。

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);
}
ddrv8njm

ddrv8njm1#

更改对同步改进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上调用此方法

编辑

你也可以继续使用enqueue,但是你需要提供一个“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这样的库来使它更容易,我真的推荐给你。

lzfw57am

lzfw57am2#

如果我错了,请纠正我,这是主线程吗?这将造成不等答复的问题。
考虑使用async

chhkpiq4

chhkpiq43#

我不知道它是否有帮助,但我认为我的调用。enqueue()被跳过,但我没有处理我得到的响应,我得到了一个400响应。所以我建议你记录你得到的响应代码。希望它能帮助某人。

call.enqueue(new Callback < LoginResponse > () {
     @ Override
    public void onResponse(Call < LoginResponse > call, Response < LoginResponse > response) {
        Log.i(TAG, "Response code " + response.code());
        if (response.code() == 200) {
            Toast.makeText(MainActivity.this, "Going into Login page", Toast.LENGTH_LONG).show();
        }
        /*if(response.code()==400){
        Toast.makeText(MainActivity.this, "Error 400", Toast.LENGTH_LONG).show();
        }* added it later after i saw in debugging that i am gettting
        400 error because i was using email instead of username */
    }
     @ Override
    public void onFailure(Call < LoginResponse > call, Throwable t) {
        Log.e(TAG, "onFailure: " + t.getMessage());
    }
});
}
});

相关问题