저는 발리를 사용하고 있습니다 만, 발리가 AsyncTask의 onPostExecute()와 같은 것을 구현하지 않아서 잘못된 목록 항목에 대해 중복 된 데이터를 얻고 있기 때문에 JSON 구문 분석 된 데이터에 문제가있는 것 같습니다. 발리 요청 관리자
는 그럼 난이 건너 온 : https://github.com/yakivmospan/volley-request-manager#custom-listener-implementation-는는 사람이 그것을 사용 했습니까? 현재 발리 코드에 어떻게 추가 할 수 있습니까? 여기 Volley not sending correct data. How to implement an alternative to onPostExecute()?
UPDATE
요청으로 내 문제, 일부 코드에 대한
자세한 내용. 여기에 파서 클래스에 JSON을 전송 한 후 일부 원시 JSON 데이터 (NovaJSON를) 요청하고 발리를 사용하는 다른 클래스 (NovaParser)의 메소드를 호출하는 버튼입니다 :
info.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String instanceDetail = NovaJSON.shared().receiveDetail(getId());
Dialog dialog = new Dialog(v.getContext());
dialog.setContentView(R.layout.instances_info);
TextView image = (TextView) dialog.findViewById(R.id.imageInstance);
TextView flavor = (TextView) dialog.findViewById(R.id.flavorInstance);
dialog.setTitle(name.getText() + " Details");
if (instanceDetail != null) {
image.setText(" \u2022 image : " + NovaParser.shared().parseImages(instanceDetail));
flavor.setText(" \u2022 flavor : " + NovaParser.shared().parseFlavor(instanceDetail));
}
dialog.show();
}
});
이는 발리를 수행하는 방법은
public static String parseImages(String imagesDetail){
ArrayList<HashMap<String, String>> imagesList = NovaParser.shared().getImagesList();
String temp = null;
JSONObject novaDetail = null;
try {
novaDetail = new JSONObject(imagesDetail);
JSONObject server = novaDetail.getJSONObject("server");
JSONObject image = server.getJSONObject("image");
if (imagesList !=null){
temp = image.getString("id");
for (Map<String,String> map : imagesList) {
if (map.containsValue(temp)) {
temp = map.get(NAME);
}
}
}
} catch (JSONException e) {
e.printStackTrace();
}
return temp;
}
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);
}
}
}
} catch (JSONException e) {
e.printStackTrace();
}
return temp;
}
내가 버튼 O를 누르십시오 : 문자열이 다음과 같은 방법을 사용하여 분석 할로
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();
queue.add(getRequest);
}
그런 다음 서버에서 JSON을 전송 다음 NovaJSON 클래스에 요청 대화 상자가 빈 값으로 표시됩니다. 두 번째로 그것을 누르면 정확한 파싱 된 데이터를 얻습니다. 기본적으로 처음 버튼을 클릭하면 instanceDetail 문자열이 null이됩니다. Volley가 해당 작업을 완료하지 않았기 때문에 마지막으로 첫 번째 요청을 완료했기 때문에 두 번째로 값을로드합니다.
저는 Volley가 비동기이며, 요청이 동시에 발생하고 응답이 즉시 발생하지 않는다는 것을 알고 있습니다. 그러나 앱에 데이터를 기다리는 피드백을 사용자에게주기 위해 진행률 표시 줄이나 회전 휠이 필요합니다. 그것은 AsyncTask로 할 수 있지만 Volley에서는 가능하지 않습니다.
내 발리 문제는 요청 처리 방식입니다. 예를 들어, "name"이라는 기본값을 가진 텍스트 뷰를 변경하는 Volley 요청을 트리거하는 버튼이있는 경우 버튼을 처음 클릭하면 "name"이 표시되고 두 번째 시간은 클릭해야합니다. 내가 기대했던 실제 가치. onPostExecute()를 사용하면 요청이 완료 될 때까지 기다렸다가 곧바로 올바른 결과를 얻을 수 있습니다. – GITcommitEd
코드 부분 – NickF
여기에 게시하십시오 ... 업데이트 – GITcommitEd