我有一个包含 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() 之后以某种方式设置适配器。
谢谢