0

我有一个包含 Google Books API id 的字符串列表。

我想从这些书中检索信息。

为了做到这一点,我使用这个:

public class MyBookClient {

    private static final String API_BASE_URL = "https://www.googleapis.com/books/v1/volumes/";
    private AsyncHttpClient client;

    public MyBookClient() {
        this.client = new AsyncHttpClient();
    }

    public void getBooks(final String query, JsonHttpResponseHandler handler) {
        try {
            client.get( API_BASE_URL + URLEncoder.encode( query, "utf-8" ), handler );
        } catch (UnsupportedEncodingException ignored) {

        }
    }

}

for (int i = 0; i < Books.size(); i++){ 
    MyBookClient client = new MyBookClient();
    client.getBooks( Books.get(i), new JsonHttpResponseHandler() {
        @Override
        public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
            if (response != null) {
                final MyBook books = MyBook.fromJson( response );
                titles.add( books.getTitle() );
                authors.add( books.getAuthor() );
                covers.add( books.getCoverUrl() );;
            }
        }
    } );
}

----LOADING titles,authors,covers into adapter----

public static MyBook fromJson(JSONObject jsonObject) {
    MyBook book = new MyBook();
    try {
        JSONObject volumeInfo = jsonObject.getJSONObject( "volumeInfo" );
        book.title = volumeInfo.has( "title" ) ? volumeInfo.getString( "title" ) : "";
        book.author = getAuthor( volumeInfo );
        book.genre = getGenre( volumeInfo );
        book.publisher = volumeInfo.has( "publisher" ) ? volumeInfo.getString( "publisher" ) : "";
        book.description = volumeInfo.has( "description" ) ? volumeInfo.getString( "description" ) : "";
        book.pages = volumeInfo.has( "pageCount" ) ? volumeInfo.getInt( "pageCount" ) : 0;
        book.bookid = jsonObject.has( "id" ) ? jsonObject.getString( "id" ) : "";
        book.rating = volumeInfo.has( "averageRating" ) ? String.valueOf( volumeInfo.getDouble( "averageRating" ) ) : "0";
        book.isUploaded = false;
    } catch (JSONException e) {
        return null;
    }
    return book;
}

问题是,因为它是asynctask,我无法将列表(标题、作者、封面)正确加载到 reyclerView 中,因为我在异步完成之前设置了适配器很多次。

我读到建议将循环推送到异步内部而不是异步内部循环,但我不知道如何在这里执行。

基本上,我需要在加载所有 Books.get() 之后以某种方式设置适配器。

谢谢

4

0 回答 0