2012-01-31 90 views
2

這是我的問題: 我有我從服務器檢索值的列表。 這些值在UI中填充ListView。 我無法繼續加載視圖並將其顯示給用戶,直到列表已滿。 由於Android強制我在單獨的線程中進行http調用,我的問題是如何創建1個執行httprequests的類,並在調用類中等待,直到我從HttpRequest獲得響應,然後繼續加載View? 現在我有這樣的類,它的要求:如何使阻止Android 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

HAHAHA,很抱歉,在另一個線程中做你的請求的全部內容都是爲了讓它不會等待。只需將請求放在您的onCreate方法中... – L7ColWinters 2012-01-31 14:55:33

+0

顯示ProgressDialog .. – Jens 2012-01-31 15:00:06

+0

如何顯示ProgressDialog幫助?我真的不想在每個需要創建httprequest的類中創建請求方法。必須有一種方法可以讓這個更加面向對象,甚至iOs都有這個.... comon球員...... – 2012-01-31 15:03:54

回答

0

從上下文傳遞給您的課程。重載onPreExecute()以顯示ProgressDialog,然後重載onPostExecute()以隱藏ProgressDialog。這會讓你在加載你的用戶時阻塞。

有一種有點哈克的方式來獲得更多的控制權。如果您希望將AsyncTask保留爲單獨的類,但允許它更新另一個Activity中的UI元素,請在該Activity中定義一個Handler,然後將其傳遞給AsyncTask的構造函數。然後,您可以將AsyncTask的onPostExecute()方法中的消息發送到處理程序,以告訴它更新UI。您需要確保處理程序正確處理您的AsyncTask發回的消息。可能會更清潔一些,但它可以工作,並且允許您重複使用一個可以跨活動進行網絡調用的asyncTask。

+0

對不起,我對android有點新意,你能發表一個示例代碼嗎?謝謝 – 2012-02-01 15:22:01