XamarinにHttpClientのデータでリストを埋め込むアンドロイドアプリを作成しています。複数の画面があります。私は、非同期呼び出しがリストについては、いくつかのJSONデータを取りに行くために作るAndroid、非同期/アクティビティネガティブ処理後にスロー例外が発生する
:
は、ここで問題です。ユーザーがリストを表示しているアクティビティに移動すると、この権利が発生します。これは、ユーザーが離れて移動しない場合、正常に動作します。ネットワークコールが起動している間、UIは応答します。すばらしいです。
しかし、ユーザーが別の画面にすばやく移動して、非同期呼び出しが完了する前に戻ると、未処理の例外が詳細なしでスローされます。何が起こっているのかは、httpClientがデータを戻していることを前提としていますが、廃棄されたアクティビティーに戻しています。
キャンセルトークンを使用しようとしました。そのため、離れたところを移動すると、cancellationTokenSourceでキャンセルを呼び出します。私はそれを間違ってやっているかもしれませんが、何とか続行する前に非同期呼び出しがキャンセルされたという確認を受けるまで待つべきですか?
この問題を防ぐ適切な方法は何ですか?
CODE:フラグメントで
:
private async void SwipeRefreshLayout_Refresh(object sender, EventArgs e)
{
_cancelRefreshCall = new CancellationTokenSource();
var swipeRefreshLayout = View.FindViewById<SwipeRefreshLayout>(Resource.Id.swipeRefreshLayout1);
swipeRefreshLayout.Refreshing = true;
_items.Clear();
List<item> items = new List<item>();
try
{
await Task.Run(async() =>
{
try
{
await _itemService.RefreshItems(_cancelRefreshCall.Token);
restaurants = await _itemService.GetLatestItems(_cancelRefreshCall.Token);
}
catch (System.OperationCanceledException ex)
{
}
catch (Exception ex)
{
}
}, _cancelRefreshCall.Token);
}
catch (Exception ex)
{
}
foreach (var item in items)
{
_items.Add(item);
}
swipeRefreshLayout.Refreshing = false;
}
ここで離れて移動するためのボタンです:
private void SubmitItem_Click(object sender, EventArgs e)
{
if (_cancelRefreshCall != null)
{
_cancelRefreshCall.Cancel();
}
// redirect to preference page once done
var fgManager = this.Activity.SupportFragmentManager.BeginTransaction();
var fragment = this.Activity.SupportFragmentManager.FindFragmentByTag(Constants.LeahNutrinoPrefTag);
if (fragment== null)
{
fgManager.Replace(Resource.Id.HomeFrameLayout, new ProfileFragment(), Constants.ProfileTag);
}
else
{
fgManager.Replace(Resource.Id.HomeFrameLayout, fragment, Constants.ProfileTag);
}
fgManager.Commit();
}
は、あなたがしようとしている何の問題のいくつかのコードサンプルを供給することはできますか? –
完了しました、ごめんなさい。 – GMorini