2013-04-17 25 views
1

我正在編寫一個簡單的天氣應用程序,以便學習如何針對Android進行編程,但是我已經陷入了僵局。在異步HTTP請求中觸發onSuccess活動

目前,應用程序獲取用戶的GPS位置,然後發送請求到API以獲取天氣信息。問題是,我將這些API調用抽象爲另一個名爲Darksky的類,它們異步運行。

當我做這樣的事情時,這成爲一個問題:weeklyForecast = darksky.getWeeklyForecast();。由於請求在getWeeklyForecast()方法中異步運行,weeklyForecast將返回爲空,因爲該方法在從API獲得響應之前返回。

這裏有興趣的人是方法:

public ArrayList<Forecast> getWeeklyForecast() { 
    // Clear before inserting new data 
    weeklyForecast.clear(); 

    client.get(BASE_URL + API_KEY + "/" + latitude + "," + longitude + "?units=uk&exclude=hourly%2Calerts%2Cflags", null, new AsyncHttpResponseHandler() { 
     @Override 
     public void onSuccess(String response) { 
      try { 
       JSONObject root = new JSONObject(response); 
       JSONObject daily = root.getJSONObject("daily"); 
       JSONArray forecasts = daily.getJSONArray("data"); 

       // Loop through every day 
       for (int i = 0; i < forecasts.length(); i++) { 
        JSONObject dayObject = forecasts.getJSONObject(i); 

        weeklyForecast.add(new Forecast(
         dayObject.getInt("time"), 
         dayObject.getString("summary"), 
         dayObject.getString("icon"), 
         dayObject.getDouble("temperatureMin"), 
         dayObject.getDouble("temperatureMax"), 
         dayObject.getDouble("windSpeed"), 
         dayObject.getDouble("humidity") 
        )); 
       } 
      } catch(Exception e) { 
       // TODO: handle 
      } 
     } 
    }); 

    return weeklyForecast; 
} 

如何檢測時,從我的主要活動HTTP請求的onSuccess()事件觸發?

回答

0

當您開始下載時,使用downloadComplete方法偵聽Darksky類的對象。在onSuccess中調用它,並將結果傳遞給它。 downloadComplete調用時更新UI。

1

下載完成後使用接口獲取回調,如下所示。

class Darksky{ 

    interface updateUI{ 
     void onFinishedDownload(ArrayList<Forecast> array); 
    } 

    public ArrayList<Forecast> getWeeklyForecast() { 
     // Clear before inserting new data 
     weeklyForecast.clear(); 

     client.get(BASE_URL + API_KEY + "/" + latitude + "," + longitude + "?units=uk&exclude=hourly%2Calerts%2Cflags", null, new AsyncHttpResponseHandler() { 
      @Override 
      public void onSuccess(String response) { 
       try { 
        JSONObject root = new JSONObject(response); 
        JSONObject daily = root.getJSONObject("daily"); 
        JSONArray forecasts = daily.getJSONArray("data"); 

        // Loop through every day 
        for (int i = 0; i < forecasts.length(); i++) { 
         JSONObject dayObject = forecasts.getJSONObject(i); 

         weeklyForecast.add(new Forecast(
           dayObject.getInt("time"), 
           dayObject.getString("summary"), 
           dayObject.getString("icon"), 
           dayObject.getDouble("temperatureMin"), 
           dayObject.getDouble("temperatureMax"), 
           dayObject.getDouble("windSpeed"), 
           dayObject.getDouble("humidity") 
           )); 
        } 
       } catch(Exception e) { 
        // TODO: handle 
       } 

       updateUI.onFinishedDownload(weeklyForecast); 
      } 
     }); 

    } 
} 

在你的活動或UIClasses你只需要實例化updateUI界面和使用ArrayList中傳遞:

@Override 
public void onFinishedDownload(ArrayList<Forecast> array) { 
    // Do something with your arraylist here. 
}