JSON

2014-11-11 2 views
0

을로드 할 때 ProgressDialog를 멈출 수 없습니다. 해결책을 찾지 못하도록 막았습니다. 데이터 json이 이미 ArrayList에 있고 오류가 발견되지 않았지만 progressdialog가로드를 중지 할 수 없습니다. postExecute에 이미 PG.dismis를 넣었지만 어댑터도 변경할 수 없습니다.JSON

private static List<DataVoucher> processResponse(String response) { 
    List<DataVoucher> list = new ArrayList<DataVoucher>(); 
    try { 
     JSONObject jsonObj = new JSONObject(response); 
     JSONArray jsonArray = jsonObj.getJSONArray("produk"); 
     Log.d(TAG, "data lengt: " + jsonArray.length()); 
     DataVoucher dataVoucher = null; 
     for (int i = 0; i < jsonArray.length(); i++) { 
      JSONObject obj = jsonArray.getJSONObject(i); 
      dataVoucher = new DataVoucher(); 
      dataVoucher.setKode(obj.getString("kode")); 
      dataVoucher.setHrg(obj.getString("hrg")); 
      dataVoucher.setNom(obj.getString("nom")); 
      dataVoucher.setKet(obj.getString("ket")); 
      list.add(dataVoucher); 

      listvoucher.add(obj.getString("nom")); 
     } 
    } catch (JSONException e) { 
     Log.d(TAG, e.getMessage()); 
    } 
    return list; 
} 

public static String requestDataVoucher(final String operator) { 
    final String TAG = "SEND JSON"; 
    Thread thread = new Thread() { 
     public void run() { 
      Looper.prepare(); 
      JSONObject jsonObjSend = new JSONObject(); 

      try { 
       jsonObjSend.put("type", "svoc"); 
       jsonObjSend.put("hp", "089631633614"); 
       jsonObjSend.put("opr", operator); 

       Log.i(TAG, jsonObjSend.toString(2)); 

      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

      SendHttpPost(jsonObjSend); 
      Looper.loop(); 
     } 
    }; 
    thread.start(); 
    return TAG; 
} 

private class MainActivityAsync extends AsyncTask<String, Void, String> { 

    @Override 
    protected void onPreExecute() { 
     progressDialog = new ProgressDialog(MainActivity.this); 
     progressDialog.setMessage("retrieving..."); 
     progressDialog.setIndeterminate(false); 
     progressDialog.setCancelable(false); 
     progressDialog.show(); 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     String response = requestDataVoucher(pilihOperator 
       .getSelectedItem().toString()); 
     list = processResponse(response); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     adapter = new ArrayAdapter<String>(MainActivity.this, 
       android.R.layout.simple_spinner_item, listvoucher); 
     adapter.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line); 
     pilihVoucher.setAdapter(adapter); 
     adapter.notifyDataSetChanged(); 

     if (!adapter.isEmpty()) { 
      progressDialog.dismiss(); 
     } // this is annoying 
    } 
} 

답변

0

어댑터 = ArrayAdapter와 새로운 (MainActivity.this, android.R.layout.simple_spinner_item, listvoucher);

나는 u를 의미한다고 생각합니다. adapter = new ArrayAdapter (MainActivity.this, android.R.layout.simple_spinner_item, list);

Btw 그냥 onPostExecute()에서 아무 것도 확인하지 않고 목록이 비어 있으면 사용자에게 경고하여 url progressDialog를 닫아서 이러한 문제를 피할 수 있습니다.

+0

postexecude에 넣을 경우 어댑터 회전기 pilihvoucher가 변경되지 않았습니다. – Ashadi

+0

if (! adapter.isEmpty()) { progressDialog.dismiss(); } ---> progressDialog.dismiss(); u가 데이터를 볼 수없는 경우 목록이 비어있을 수 있습니다. 그것을 디버그 – MrHexar

0

많은 문제를 여기

  • doInBackground는 UI 스레드에서 다른 스레드에서 실행됩니다. 이 경우 쓸모없는 새 스레드를 만드는 requestDataVoucher을 호출하고 있습니다.

  • 의 결과 인 response 문자열로 processResponse을 호출하고 있습니다. 코드에 따르면 response"SEND JSON"과 같습니다. 따라서 JSONObject jsonObj = new JSONObject(response);은 예외를 유발하고 listvoucher는 비어있게되며 어댑터도 마찬가지입니다. 결론, 어댑터가 비어, progressDialog 사라지지 않을 것입니다.

SendHttpPost은 알 수 없으므로 수정을 제안 할 수 없습니다. 그러나 내 이해가 간다면 requestDataVoucher에서 스레드 생성을 제거하고 SendHttpPost에 의해 생성 된 JSON 문자열을 반환해야합니다.