0

Windows Phone 8 でタイトルに書かれていることを実行しようとしていますが、その方法は次のとおりです。

private async void Application_Launching(object sender, LaunchingEventArgs e)
{
    var settings = IsolatedStorageSettings.ApplicationSettings;
    settings.Add("listofCurrency", await CurrencyHelpers.getJsonCurrency());
}

CurrencyHelpers では:

    public async static Task<Dictionary<string, double>> getJsonCurrency()
    {
        HttpClient client = new HttpClient();

        string jsonResult = await client.GetStringAsync("http://openexchangerates.org/api/latest.json?app_id=xxxxxxx");

        JSONCurrency jsonData = JsonConvert.DeserializeObject<JSONCurrency>(jsonResult);

        Dictionary<string, double> currencyCollection = new Dictionary<string, double>();

        currencyCollection = jsonData.Rates;

        return currencyCollection;

    }

MainPage が読み込まれるとすぐに、CurrencyHelpers から別のメソッドを呼び出します。

    public static KeyValuePair<double, double> getStorageCurrencyPairRates(string firstCurrency, string secondCurrency)
    {
        var settings = IsolatedStorageSettings.ApplicationSettings;
        double firstCurrencyRate = 1;
        double secondCurrencyRate = 1;

        Dictionary<string, double> currencyCollection = new Dictionary<string,double>();

        //needs some code here to check if "listofCurrency" already has JSONData stored in it.

        settings.TryGetValue<Dictionary<string,double>>("listofCurrency", out currencyCollection);

        foreach (KeyValuePair<string, double> pair in currencyCollection)
        {
            if (pair.Key == firstCurrency)
            {
                firstCurrencyRate = pair.Value;
            }

            else if (pair.Key == secondCurrency)
            {
                secondCurrencyRate = pair.Value;
            }
         }

        return new KeyValuePair<double, double>(firstCurrencyRate, secondCurrencyRate);          
    }
}

JSONデータをストレージに保存し、利用可能になったらすぐに取得したいという考えはありますか? 助けていただければ幸いです。

4

1 に答える 1

0

await と async の考え方は正しいですが、ページの読み込み時に別のメソッドを呼び出してその概念を破壊しました。ウィルフレッド・ウィーの言ったことも間違っています。

正しい方法は、次のように App.xamls.cs でイベント ハンドラーを宣言することです。

public event EventHandler<bool> SettingsReady;

次に、 Application_Launching() メソッドを次のように変更します。

private async void Application_Launching(object sender, LaunchingEventArgs e)
{
    var settings = IsolatedStorageSettings.ApplicationSettings;
    settings.Add("listofCurrency", await CurrencyHelpers.getJsonCurrency());

    if (SettingsReady!= null)
        SettingsReady(this, true);
}

次に、MainPage.xaml.cs (コンストラクター - ロードされていないとき) で、データが実際に準備できるときに呼び出されるコールバック関数を宣言します。

    // Constructor
    public MainPage()
    {
        InitializeComponent();

        // Call back functions
        App.SettingsReady += App_SettingsReady;
    }

    void App_SettingsReady(object sender, bool e)
    {
        // Here call your function for further data processing
        getStorageCurrencyPairRates();
    }
于 2013-08-17T08:06:38.867 に答える