我正在尝试创建一个
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一般都不是很有经验(我只是在路上学习)所以我不知道如何继续.
从谷歌开发者网站我发现了一个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;
}
}
从服务器源接收的数据应类似于:
buildAppInfo(
"Browsers",
"Firefox",
"description",
"Mozilla",
"com.mozilla.firefox",
"http://...",
"http://..."
)
buildAppInfo(
"Browsers",
"Firefox",
"description",
"Mozilla",
"com.mozilla.firefox",
"http://...",
"http://..."
)
[...]
//BUT IN JSON FORMAT
我的整个方法显然不起作用.有人可以帮助我实现我的需求吗?谢谢.
最佳答案 您想要做的最简单的设置需要:
一种从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;
}
将收到的信息映射到特定App对象的List,例如:
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应用程序消耗列表(json数组的“app”json对象)通过RESTful服务,使用从Android应用程序的这个答案写的代码(是的,你可以导入这个作为一个功能齐全的Android工作室项目):https://github.com/elcodedocle/android-resttest
请记住,这是一个基本的例子,使用我能为初学者提出的最简单的方法.如果您在Java生态系统中保持一段时间的编码,那么一旦您有足够的经验可以绕过正确的使用情况,您将发现更多适合您的项目的高级工具.