2016-11-20 4 views
2

私はXamarinでAndroid Appを開発しています。私はいくつかのメソッドを公開してwebservicesを呼び出す静的クラスのNetworkServicesを持っています。 そのうちの一つ、クエリサーバーのステータス:このメソッドは、OnCreate関数から呼び出されXamarin Androidの開発:タスクの結果を取得

public static async Task<SystemInfo> TestConnection(HomeServerInfo hsi) 
     { 
      HttpClient openRequest = new HttpClient(); 
      HttpResponseMessage hrm = await openRequest.GetAsync(new System.Uri(hsi.ToString() + "/HomeServices/ServerController")); 

      return new SystemInfo(hrm.ToString()); 
     } 

// Query server status 
      Task<SystemInfo> si = NetworkServices.TestConnection(hsi); 
      serverStatus.SetText(si.Result.CurrentDateTime, TextView.BufferType.Normal); 

が、これはアプリを凍結します。 なぜ間違っていますか?クエリの結果プロパティが正しくありませんか? ありがとうございます

答えて

0

バックグラウンドでタスクを実行し、UIスレッドのUIアップデートで続行する必要があります。

// Query server status 
Task<SystemInfo> si = NetworkServices.TestConnection(hsi); 
si.ContinueWith((result) => 
{ 
    using(var h = new Handler(Looper.MainLooper)) 
    { 
     h.Post(()=>serverStatus.SetText(result.CurrentDateTime, TextView.BufferType.Normal)); 
    } 
} 

si.Start(); 
+0

ありがとうございます!私はちょっと混乱しています... TestConnectionはTaskオブジェクトを返します。私がResultプロパティを呼び出すと、タスクは実行されましたか?または、UIスレッドが完了するまで待ちますか?私に少し説明できますか? – robyg72

+0

正確に! TaskのResultプロパティのgetterは、タスクが終了するまでWaitと同等です。メインスレッド(onCreate()内)で実行するので、Resultが計算されるまでアプリをブロックします。 Resultプロパティに右クリックすると、現在のコンテキストでタスクが実行されます。 http://stackoverflow.com/questions/12484112/what-happens-while-waiting-on-a-tasks-result – nevalenny

+0

私は説明に非常に感謝しています!さようなら – robyg72

関連する問題