Android 截击未发送正确的数据。如何实现onPostExecute()的替代方案?
我正在使用Volley获取一些JSON数据,以填充RecyclerView列表。初始JSON文件返回一些信息,如: 身份证件 服务器 地位 如果我使用服务器URL/Server/id请求一个新的JSON,那么我可以获得一些关于服务器/项目的额外信息,以显示在视图上,如: 住址 类型 风味 我想在我的RecyclerView列表中显示每个项目的两组信息,如: 服务器 地位 住址 类型 风味 但是,我需要每个服务器的id,以便使用辅助JSON文件获取额外信息 为了说明,我需要得到: server1-active-1.1.1.1-type1-flavor1 server2-stopped-2.2.2-type2-2 server3-3.3.3-type3-3 但我得到了: server1-active-1.1.1.1-type1-flavor1 server2-stopped-1.1.1-type1-1 服务器3-1.1.1.1-type1-1 我将以下代码放在适当的位置,以获取每个项目的额外信息,以便在解析主JSON文件时请求额外数据,但是我为每个项目获得完全相同的地址、类型和风格: 解析器类:Android 截击未发送正确的数据。如何实现onPostExecute()的替代方案?,android,json,android-volley,Android,Json,Android Volley,我正在使用Volley获取一些JSON数据,以填充RecyclerView列表。初始JSON文件返回一些信息,如: 身份证件 服务器 地位 如果我使用服务器URL/Server/id请求一个新的JSON,那么我可以获得一些关于服务器/项目的额外信息,以显示在视图上,如: 住址 类型 风味 我想在我的RecyclerView列表中显示每个项目的两组信息,如: 服务器 地位 住址 类型 风味 但是,我需要每个服务器的id,以便使用辅助JSON文件获取额外信息 为了说明,我需要得到: server1-
public class NovaParser extends Activity{
public static final String ID = "id";
public static final String NAME = "name";
public static final String STATUS = "status";
public static final String FLAVOR = "flavor";
public static final String NETID = "netid";
public static final String ADDR = "addr";
public static final String HOST = "host";
public String authToken;
public String novaURL;
public SharedPreferences shPref;
public ArrayList<HashMap<String, String>> flavorList;
public static NovaParser parser = null;
public static NovaParser shared(){
if (parser == null){
parser = new NovaParser();
}
return parser ;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
public void setFlavorList(ArrayList<HashMap<String, String>> flavorList) {
this.flavorList = flavorList;
}
public ArrayList<HashMap<String, String>> getFlavorList(){
return flavorList;
}
public static ArrayList<HashMap<String, String>> parseJSON(String novaJSON){
ArrayList<HashMap<String, String>> jsonList = new ArrayList<HashMap<String, String>>();
ArrayList<HashMap<String, String>> tempList = new ArrayList<HashMap<String, String>>();
try {
NovaInstances novaInstance = new NovaInstances();
JSONObject nova = new JSONObject(novaJSON);
JSONArray servers = nova.getJSONArray("servers");
for (int i = 0; i < servers.length(); i++) {
JSONObject objsrv = servers.getJSONObject(i);
novaInstance.setName(objsrv.getString("name"));
novaInstance.setId(objsrv.getString("id"));
novaInstance.setStatus(objsrv.getString("OS-EXT-STS:vm_state"));
novaInstance.setHost(objsrv.getString("OS-EXT-SRV-ATTR:host"));
String id = novaInstance.getId();
String instanceDetail = NovaJSON.shared().receiveDetail(id);
if (instanceDetail != null) {
novaInstance.setFlavor(parseFlavor(instanceDetail));
}
String netDetail = NovaJSON.shared().receiveIP(id);
if (netDetail != null) {
tempList = parseNet(netDetail);
}
for (int j = 0; j < tempList.size(); j++) {
novaInstance.setNetid(tempList.get(j).get(NETID));
novaInstance.setAddr(tempList.get(j).get(ADDR));
}
HashMap<String, String> map = new HashMap<String, String>();
map.put(NAME, novaInstance.getName());
map.put(ID, novaInstance.getId());
map.put(STATUS, novaInstance.getStatus());
map.put(FLAVOR, novaInstance.getFlavor());
map.put(HOST, novaInstance.getHost());
map.put(NETID, novaInstance.getNetid());
map.put(ADDR, novaInstance.getAddr());
jsonList.add(map);
}
} catch (JSONException e) {
Log.d("ErrorInitJSON", e.toString());
e.printStackTrace();
}
Collections.sort(jsonList, new Comparator<HashMap<String, String>>() {
@Override
public int compare(HashMap<String, String> lhs, HashMap<String, String> rhs) {
return (lhs.get("name")).compareToIgnoreCase(rhs.get("name"));
}
});
return jsonList;
}
public static String parseFlavor(String instanceDetail){
ArrayList<HashMap<String, String>> flavorList = NovaParser.shared().getFlavorList();
String temp = null;
JSONObject novaDetail = null;
try {
novaDetail = new JSONObject(instanceDetail);
JSONObject server = novaDetail.getJSONObject("server");
JSONObject flavor = server.getJSONObject("flavor");
if (flavorList !=null){
temp = flavor.getString("id");
for (Map<String,String> map : flavorList) {
if (map.containsValue(temp)) {
temp = map.get(NAME);
}
}
}
/*JSONObject addresses = server.getJSONObject("addresses");
Iterator<String> keys=addresses.keys();
while(keys.hasNext())
{
String key=keys.next();
String value=addresses.getString(key);
novaInstance.setNet(value);
}
JSONObject security_groups = server.getJSONObject("security_groups");*/
} catch (JSONException e) {
e.printStackTrace();
}
return temp;
}
public static ArrayList<HashMap<String, String>> parseNet(String netDetail){
ArrayList<HashMap<String, String>> netList = new ArrayList<HashMap<String, String>>();
String netId = null, addr = null;
JSONObject net = null;
try {
net = new JSONObject(netDetail);
JSONObject addresses = net.getJSONObject("addresses");
Iterator<String> keys=addresses.keys();
while(keys.hasNext())
{
String key=keys.next();
String value=addresses.getString(key);
netId = key;
JSONArray network = addresses.getJSONArray(key);
for (int i = 0; i < network.length(); i++) {
JSONObject objnet = network.getJSONObject(i);
addr = objnet.getString("addr");
HashMap<String, String> map = new HashMap<String, String>();
map.put(NETID, netId);
map.put(ADDR, addr);
netList.add(map);
}
}
} catch (JSONException e) {
e.printStackTrace();
}
return netList;
}
}
getJSONxxx工作正常,使用每个项目的JSON数据设置novaJSONxxx字符串,但是getter getNovaxxx始终返回第一个项目的值。看来这个接球手射门太快了。使用AsyncTask,可以在数据准备就绪时运行onPostExecute,但是Volley没有此选项
有没有办法让它工作或实现一个替代方案,以便将每个JSON数据返回到正确的项目?我通过完全抛弃凌乱并着手改进解决了我的问题。我将所有调用设置为sync/blocking,使用try/catch解决异常/错误,并在OkHTTP客户端上设置一个短超时。现在它按我的要求工作。您在清单中添加了标记了吗?还要检查您是否正在获取JSONArray或JSONObject。请检查本教程的JSON数据是好的,我得到正确的信息时,检查调试器。这只是在截击获得数据之前发送信息的人。不确定清单中的标记是什么意思?打开AndroidManifest.xml并使用android:name属性在标记中添加Volley singleton类,以便在应用程序启动时自动执行此类。-你也可以在教程中找到这段代码哦,是的,都完成了。正如我提到的那样,截击可以很好地工作,我得到了所有的JSON数据,这不是问题所在。问题是数据需要一段时间才能恢复。我需要某种类型的侦听器来告诉从服务器到达的数据,我可以将其分配给我正在使用的字符串,但我不确定是否以及如何能够做到这一点。
public class NovaJSON extends Activity {
String novaJSON;
String nova;
String auth;
String novaJSONdetail;
String novaJSONip;
String id;
RequestQueue queue = null;
public static NovaJSON parser = null;
public static NovaJSON shared(){
if (parser == null){
parser = new NovaJSON();
}
return parser ;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getNovaJSON() {
return novaJSON;
}
public void setNovaJSON(String novaJSON) {
this.novaJSON = novaJSON;
}
public String getNova() {
return nova;
}
public void setNova(String nova) {
this.nova = nova;
}
public String getAuth() {
return auth;
}
public void setAuth(String auth) {
this.auth = auth;
}
public String getNovaJSONdetail() {
return novaJSONdetail;
}
public void setNovaJSONdetail(String novaJSONdetail) {
this.novaJSONdetail = novaJSONdetail;
}
public String getNovaJSONip() {
return novaJSONip;
}
public void setNovaJSONip(String novaJSONip) {
this.novaJSONip = novaJSONip;
}
public String receiveData (String novaURL, String authToken){
setNova(novaURL);
setAuth(authToken);
getJSON();
getNovaJSON();
return novaJSON;
}
public String receiveDetail (String id){
setId(id);
getJSONdetail();
getNovaJSONdetail();
return novaJSONdetail;
}
public String receiveIP (String id){
setId(id);
getJSONip();
getNovaJSONip();
return novaJSONip;
}
public void getJSON() {
final String authToken = getAuth();
String novaURL = getNova();
novaURL = novaURL+"/servers/detail";
JsonObjectRequest getRequest = new JsonObjectRequest(Request.Method.GET, novaURL, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d("Nova on Response", response.toString());
setNovaJSON(response.toString());
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d("Nova on Error", "Error: " + error.getMessage());
setNovaJSON(error.toString());
}
}
) {
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
params.put("X-Auth-Token", authToken);
params.put("User-Agent", "stackerz");
params.put("Accept", "application/json");
params.put("Content-Type", "application/json; charset=utf-8");
return params;
}
};
queue = VolleySingleton.getInstance(this).getRequestQueue();
//VolleySingleton.getInstance(this).addToRequestQueue(getRequest);
queue.add(getRequest);
}
public void getJSONdetail() {
final String authToken = getAuth();
String novaURL = getNova();
novaURL = novaURL+"/servers/"+id;
JsonObjectRequest getRequest = new JsonObjectRequest(Request.Method.GET, novaURL, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d("Nova on Response", response.toString());
setNovaJSONdetail(response.toString());
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d("Nova on Error", "Error: " + error.getMessage());
setNovaJSONdetail(error.toString());
}
}
) {
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
params.put("X-Auth-Token", authToken);
params.put("User-Agent", "stackerz");
params.put("Accept", "application/json");
params.put("Content-Type", "application/json; charset=utf-8");
return params;
}
};
queue = VolleySingleton.getInstance(this).getRequestQueue();
//VolleySingleton.getInstance(this).addToRequestQueue(getRequest);
queue.add(getRequest);
}
public void getJSONip() {
final String authToken = getAuth();
String novaURL = getNova();
novaURL = novaURL+"/servers/"+id+"/ips";
JsonObjectRequest getRequest = new JsonObjectRequest(Request.Method.GET, novaURL, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d("Nova on Response", response.toString());
setNovaJSONip(response.toString());
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d("Nova on Error", "Error: " + error.getMessage());
setNovaJSONip(error.toString());
}
}
) {
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
params.put("X-Auth-Token", authToken);
params.put("User-Agent", "stackerz");
params.put("Accept", "application/json");
params.put("Content-Type", "application/json; charset=utf-8");
return params;
}
};
queue = VolleySingleton.getInstance(this).getRequestQueue();
//VolleySingleton.getInstance(this).addToRequestQueue(getRequest);
queue.add(getRequest);
}
}
public String receiveDetail (String id){
setId(id);
getJSONdetail();
getNovaJSONdetail();
return novaJSONdetail;
}
public String receiveIP (String id){
setId(id);
getJSONip();
getNovaJSONip();
return novaJSONip;
}