使用 Retrofit 获取 JSON
Posted
技术标签:
【中文标题】使用 Retrofit 获取 JSON【英文标题】:Using Retrofit to get JSON 【发布时间】:2014-03-14 09:58:23 【问题描述】:我目前正在尝试使用 Retrofit 构建 Muzei 扩展,就像 Roman 在他的示例中使用的示例一样。
我无法真正理解 Retrofit,但这就是我所拥有的
ArtSource.java
public class ArtSource extends RemoteMuzeiArtSource
private static final String TAG = "The Muzei Collection";
private static final String SOURCE_NAME = "The Muzei Collection";
private static final int ROTATE_TIME_MILLIS = 3 * 60 * 60 * 1000; // rotate every 3 hours
public ArtSource()
super(SOURCE_NAME);
@Override
public void onCreate()
super.onCreate();
setUserCommands(BUILTIN_COMMAND_ID_NEXT_ARTWORK);
@Override
protected void onTryUpdate(int reason) throws RetryException
String currentToken = (getCurrentArtwork() != null) ? getCurrentArtwork().getToken() : null;
RestAdapter restAdapter = new RestAdapter.Builder()
.setServer("http://elliothesp.co.uk")
.build();
ArtService service = restAdapter.create(ArtService.class);
PhotosResponse response = service.getPopularPhotos();
if (response == null || response.photos == null)
throw new RetryException();
if (response.photos.size() == 0)
Log.w(TAG, "No photos returned from API.");
scheduleUpdate(System.currentTimeMillis() + ROTATE_TIME_MILLIS);
return;
Random random = new Random();
Photo photo;
String token;
while (true)
photo = response.photos.get(random.nextInt(response.photos.size()));
token = Integer.toString(photo.id);
if (response.photos.size() <= 1 || !TextUtils.equals(token, currentToken))
break;
publishArtwork(new Artwork.Builder()
.title(photo.title)
.byline(photo.user)
.imageUri(Uri.parse(photo.url))
.token(token)
.viewIntent(new Intent(Intent.ACTION_VIEW,
Uri.parse("http://www.google.com")))
.build());
scheduleUpdate(System.currentTimeMillis() + ROTATE_TIME_MILLIS);
ArtService.java
interface ArtService
@GET("/muzei.php")
PhotosResponse getPopularPhotos();
static class PhotosResponse
List<Photo> photos;
static class Photo
int id;
String user;
String title;
String url;
基本上,我正在尝试从http://elliothesp.co.uk/muzei.php 获取 JSON 并将每个项目传递给 publishArtwork。它运行异常,因为它无法从 JSON 提要中找到任何照片,而且我不确定如何使其正常工作
【问题讨论】:
pastebin.com/xAVp3CKs 这是整个日志吗?你的 ArtSource.java 的第 62 行是什么(没有完整列出) 你也可以尝试公开你的界面 照片 = response.photos.get(random.nextInt(response.photos.size())); 顺便说一句,从 500px.com api json 中提取的示例在这里:github.com/romannurik/muzei/tree/master/example-source-500px/… 【参考方案1】:好吧,你的response
的JSON
格式不适合你的界面,应该是:
interface service
@GET("/muzei.php")
Map<String,Photo> getPopularPhotos();
static class Photo
int id;
String user;
String title;
String url;
还有response
:
Map<String, Photo> response = service.getPopularPhotos();
然后在你得到response
之后重新编写你的代码来迭代它
【讨论】:
谢谢!我有一种感觉,这就是问题所在,但我并没有充分理解它。不过,您的回答让一切都非常清楚以上是关于使用 Retrofit 获取 JSON的主要内容,如果未能解决你的问题,请参考以下文章
Android 使用retrofit时,怎样获取响应的头信息
Android Studio - 使用 retrofit2 从 restdb 获取信息