我正在尝试制作一个Android类,用于创建其他应用的列表,供以后显示,直到现在我有以下代码用于创建列表(取自谷歌示例):
public final class AppList {
public static List<App> list;
public static List<App> setupApp() {
list.add(buildAppInfo(
"Browsers",
"chrome",
"description",
"Google Inc.",
"com.android.chrome",
"http://...",
"http://..."
));
list.add(buildAppInfo(
"Browsers",
"Firefox",
"description",
"Mozilla",
"com.mozilla.firefox",
"http://...",
"http://..."
));
[An so on...]
return list;
}
private static App buildAppInfo(String category,
String title,
String description,
String developer,
String packageName,
String iconImageUrl,
String bgImageUrl) {
App app = new App();
app.setId(App.getCount());
App.incCount();
app.setTitle(title);
app.setDescription(description);
app.setDeveloper(developer);
app.setCategory(category);
app.setIconImageUrl(iconImageUrl);
app.setBackgroundImageUrl(bgImageUrl);
app.setPackageName(packageName);
return app;
}
}
//From here everything is handled in other activity
我希望从Web服务器动态加载详细信息,我可以将其设置为提供JSONArray或XML,然后将这些数据放在列表中。对于我正在阅读的内容,我可以使用Volley,但我对Volley或Java一般都不是很有经验(我只是在路上学习)所以我不太了解如何继续。
在Google开发者网站上,我找到了example。我正在考虑添加这样的东西:
public final class AppList {
public static List<App> list;
public static List<App> setupApp() {
/*Json Request*/
String url = "https://json_url/";
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest( Request.Method.GET, url, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
list.add(response);//ADD ITEMS TO LIST HERE
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
return list;
}
private static App buildAppInfo(String category,
String title,
String description,
String developer,
String packageName,
String iconImageUrl,
String bgImageUrl) {
App app = new App();
app.setId(App.getCount());
App.incCount();
app.setTitle(title);
app.setDescription(description);
app.setDeveloper(developer);
app.setCategory(category);
app.setIconImageUrl(iconImageUrl);
app.setBackgroundImageUrl(bgImageUrl);
app.setPackageName(packageName);
return app;
}
}
从服务器Feed收到的数据应该是:
buildAppInfo(
"Browsers",
"Firefox",
"description",
"Mozilla",
"com.mozilla.firefox",
"http://...",
"http://..."
)
buildAppInfo(
"Browsers",
"Firefox",
"description",
"Mozilla",
"com.mozilla.firefox",
"http://...",
"http://..."
)
[...]
//BUT IN JSON FORMAT
我的整个方法显然不起作用。有人可以帮助我实现我的需求吗?谢谢。
答案 0 :(得分:2)
您想要做的最简单的设置需要:
一种从URL读取内容,解析收到的JSON数组的方法。例如,进入JSONArray or JSONObject(您可以使用mvnrepository):
public static JSONArray parseJsonFromUrl(String uri) throws IOException, JSONException {
JSONArray array = null;
try (Scanner sn = new Scanner(new URL(uri).openStream(), "UTF-8")){
array = new JSONArray(sn.useDelimiter("\\A").next());
}
return array;
}
将收到的信息映射到List
个特定App
个对象,例如:
public static List<App> getAppList(JSONArray array){
List<App> appList = new ArrayList<>();
for (int i = 0; i < array.length(); i++) {
JSONObject object = array.getJSONObject(i);
appList.add(buildAppInfo(object.getString("category"), object.getString("title"), object.getString("description"), object.getString("developer"), object.getString("packageName"), object.getString("iconImageUrl"), object.getString("bgImageUrl")));
}
return appList;
}
使用XML解析器的方法类似,使用XML解析器(详情请查看How to read XML response from a URL in java?)。
您可以使用更高级的工具(例如Jackson Mapper或Spring RestTemplate)来使用RESTful服务,但我建议您从这个简单的方法开始,直到您更熟悉Java生态系统。
<强> [UPDATE] 强>
我使用此答案的代码制作了quick demo,以便您可以修补它。您还可以使用它作为样板来构建使用Spring Boot所需的休息服务。 (查看https://elcodedocle-jsontest.herokuapp.com/apps以获取最新传递的服务travisCI构建的实时部署)
<强> [ANOTHER_UPDATE] 强>
如果您仍然无能为力,这里有一个完整的Android应用消费一个列表(&#34; app&#34; json对象的json数组)服务通过RESTful服务,使用从Android应用程序这个答案写的代码(是的,你可以将这个作为一个功能齐全的android工作室项目导入):https://github.com/elcodedocle/android-resttest
请记住,这是一个基本的例子,使用我能为初学者提出的最简单的方法。如果您在Java生态系统中保持一段时间的编码,那么一旦您有足够的经验可以绕过正确的用途,您就会发现更多适合您项目的高级工具。