2

여기 내 문제가 있습니다 : 나는 서버에서 검색 값 목록이 있습니다. 이 값들은 UI에서 ListView를 채 웁니다. 목록이 가득 찰 때까지보기를 계속로드하여 사용자에게 표시 할 수 없습니다. 안드로이드가 별도의 스레드에서 http 호출을하도록 강요하기 때문에, 내 질문은 httprequests를 수행하는 클래스를 생성하고 호출 클래스에서 HttpRequest로부터 응답을받을 때까지 기다린 후 뷰를로드하는 방법은 무엇인가? 는 지금은 요청하지,이 클래스가 있습니다차단 안드로이드 HttpRequest 만드는 방법

public class WapConnector extends AsyncTask<String, String, String>{ 
private static final String TAG = "WapConnector"; 
private String html = ""; 
private Handler mHandler; 
private String server = "http://....whatever"; 
private String callUrl = "/api/"; 
private String params = "login?u=Admin&pw=234234&format=json"; 
private int _callstate = 1; 


@Override 
protected String doInBackground(String... uri) { 
    HttpClient httpclient = new DefaultHttpClient(); 
    HttpResponse response; 
    String responseString = null; 
    try { 
     String fullUrl = ""; 
     Log.i(TAG,fullUrl); 
     if(params.length() > 0){ 
      fullUrl = server + callUrl + params + "&alf_ticket=" + Globals.getInstance().getTicket() + "&udid=" + Globals.getInstance().udid() + "&phoneNumber=" + Globals.getInstance().phoneNumber(); 
     } 
     else{ 
      fullUrl = server + callUrl + "?udid=" + Globals.getInstance().udid() + "&alf_ticket=" + Globals.getInstance().getTicket() + "&phoneNumber=" + Globals.getInstance().phoneNumber(); 
     } 
     Log.i(TAG,fullUrl); 
     response = httpclient.execute(new HttpGet(fullUrl)); 
     StatusLine statusLine = response.getStatusLine(); 
     if(statusLine.getStatusCode() == HttpStatus.SC_OK){ 
      ByteArrayOutputStream out = new ByteArrayOutputStream(); 
      response.getEntity().writeTo(out); 
      out.close(); 
      responseString = out.toString(); 
      Log.i(TAG,responseString); 
     } else{ 
      //Closes the connection. 
      response.getEntity().getContent().close(); 
      throw new IOException(statusLine.getReasonPhrase()); 
     } 
    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
     //TODO Handle problems.. 
    } catch (IOException e) { 
     //TODO Handle problems.. 
     e.printStackTrace(); 
    } 
    return responseString; 
} 

@Override 
protected void onPostExecute(String result) { 
    super.onPostExecute(result); 
    Log.i(TAG + "onPostExecute",result); 
    activity.getClass().handleResponse(); 
     //main load 
     JSONObject jobj; 
     JSONObject jvalue; 
     try { 
      jobj = new JSONObject(result); 
      if(_callstate == 1){ 
       jvalue = jobj.getJSONObject("data"); 
       String ticket = jvalue.getString("ticket"); 
       Log.i("loginwap",ticket); 
       Globals.getInstance().setTicket(ticket); 
       _callstate = 2; 
      } 
      else{ 
       jvalue = jobj.getJSONObject("countries"); 
       JSONArray countries = jvalue.getJSONArray("countries"); 

      } 
     } 
     catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
} 

을 그리고 이것은 내가 부모 클래스에서 통화를하는 방법입니다

이제
WapConnector wap = new WapConnector(); 
    wap.setCallUrl("/anyurl/"); 
    wap.callstate(3); 
    wap.setParams(""); 
    wap.execute(""); 

내 문제 그 요청이 스레드에서 실행하기 때문에, 한 번입니다 나는 wap.execute()를 호출하고, 액티비티는 계속해서로드되지만 응답을 얻을 때까지 기다렸다가 응답을 구문 분석 한 다음로드를 계속한다.

답장을 보내 주신 모든 분들께 감사드립니다 !!!

+0

하하하, 미안하지만 다른 스레드에서 요청을 수행하는 전체 시점이 너무 빠르지 않았습니다. 그냥 onCreate 메서드에 요청을 넣어 ... – L7ColWinters

+0

ProgressDialog 표시 .. – Jens

+0

ProgressDialog가 어떻게 도움이됩니까? 난 정말 모든 요청 클래스를 내가 httprequest 만들 필요가 요청 메서드를 만들고 싶지 않아요. 이것보다 Object Oriented를 만드는 방법이 있어야합니다. 심지어 iOs도 이런 ... comon guys ... –

답변

0

호출하려는 활동에서 클래스에 대한 컨텍스트를 전달하십시오. onPreExecute()를 오버로드하여 ProgressDialog를 표시 한 다음 onPostExecute()를 오버로드하여 ProgressDialog를 숨 깁니다. 이렇게하면 사용자가로드하는 동안 차단됩니다.

좀 더 제어 할 수있는 해킹 방법이 있습니다. AsyncTask를 별도의 클래스로 유지하면서 다른 Activity의 UI 요소를 업데이트 할 수있게하려면 해당 Activity에서 Handler를 정의한 다음 AsyncTask의 생성자에 전달합니다. 그런 다음 AsyncTask의 onPostExecute() 메서드에서 핸들러에 메시지를 보내 UI를 업데이트하도록 지시 할 수 있습니다. AsyncTask가 다시 보내는 메시지를 처리기가 제대로 처리하는지 확인해야합니다. 좀 더 깔끔하게 정리할 수는 있지만 작동하고 여러 작업을 통해 네트워크를 호출하는 asyncTask를 다시 사용할 수 있습니다.

+0

안드로이드에 조금 익숙해서 죄송합니다. 샘플 코드를 게시 할 수 있습니까? 감사 –