2015-01-05 4 views
0

저는 발리를 사용하고 있습니다 만, 발리가 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에서는 가능하지 않습니다.

답변

0

내가 모두 발리 덤핑 및 갱신하는 것이 이동하여 내 문제를 해결와 모든 발리 통화를 전환 할 수 있습니다. 모든 통화가 동기화/차단되도록 설정하고 try/catch를 사용하여 예외/오류를 해결하고 OkHTTP 클라이언트에서 짧은 시간 제한을 설정했습니다. 이제는 내가 원하는대로 작동합니다.

0

나는 귀하의 문제가 Volley 때문에 발생하지 않는다고 생각합니다.
보내고받는 매개 변수를 확인하십시오.
그러나 onPostExcecute이 필요한 경우 요청 다음에 호출되는
Response.Listener<JSONObject>Response.ErrorListener()이 있습니다.

는 약 Volley request manager 단지 적절한 Volley request manager 전화

+0

내 발리 문제는 요청 처리 방식입니다. 예를 들어, "name"이라는 기본값을 가진 텍스트 뷰를 변경하는 Volley 요청을 트리거하는 버튼이있는 경우 버튼을 처음 클릭하면 "name"이 표시되고 두 번째 시간은 클릭해야합니다. 내가 기대했던 실제 가치. onPostExecute()를 사용하면 요청이 완료 될 때까지 기다렸다가 곧바로 올바른 결과를 얻을 수 있습니다. – GITcommitEd

+0

코드 부분 – NickF

+0

여기에 게시하십시오 ... 업데이트 – GITcommitEd