0
タスクを実行した後(APIからデータを取得する)、UI要素を変更する(進行状況バーを非表示にしてリストビュー用のデータを割り当てる)。 APIの問題すべてのケースでデータが返されませんでした。タスクを実行した後にRunOnUiThreadでコードを実行すると応答がなくなります。特に、ブレークポイントなしでデバッグモードでコードを実行した場合は特にそうです。タスクを呼び出す前にブレークポイントを取得して実行を続けると、すべて正常に動作します。デリゲートとContinueWithまたはデリゲートを使用してタスクを実行した後にRunOnUiThreadを実行しない
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
_userData = ServiceLocator.GetService<IAuthService>().GetUserData();
_wallsViewPresenter = ViewPresenterHelper.CreateViewPresenter<WallViewPresenter, IWallView, WallActivity>(this);
_listView = FindViewById<ListView>(Resource.Id.postList);
progressBar = FindViewById<ProgressBar>(Resource.Id.progressBar1);
Task.Run(async() => {
profile = await _wallsViewPresenter.GetProfile(int.Parse(_userData.Profile));
WallModel wall = SerializationService.DeSerialize<WallModel>(profile.Wall);
_posts = (List<PostModel>) (wall.Posts.ToList());
}).ContinueWith(ar =>
{
RunOnUiThread(() => {
progressBar.Visibility = ViewStates.Gone;
_postListAdapter = new PostListAdapter(this, _posts);
_listView.Adapter = _postListAdapter;
SetListViewHeader();
_listView.AddHeaderView(_header);
FindViewById<TextView>(Resource.Id.details).Text = profile.Name;
});
});
}
バージョン:
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
_userData = ServiceLocator.GetService<IAuthService>().GetUserData();
_wallsViewPresenter = ViewPresenterHelper.CreateViewPresenter<WallViewPresenter, IWallView, WallActivity>(this);
_listView = FindViewById<ListView>(Resource.Id.postList);
progressBar = FindViewById<ProgressBar>(Resource.Id.progressBar1);
Task.Run(async() => {
profile = await _wallsViewPresenter.GetProfile(int.Parse(_userData.Profile));
WallModel wall = SerializationService.DeSerialize<WallModel>(profile.Wall);
_posts = (List<PostModel>) (wall.Posts.ToList());
if (_posts.Count != 0)
{
DataPopulated?.Invoke(this, true);
}
});
DataPopulated += (sender, e) => {
RunOnUiThread(() => {
progressBar.Visibility = ViewStates.Gone;
_postListAdapter = new PostListAdapter(this, _posts);
_listView.Adapter = _postListAdapter;
SetListViewHeader();
_listView.AddHeaderView(_header);
FindViewById<TextView>(Resource.Id.details).Text = profile.Name;
});
};
}
おかげではなく、 'プロファイルは= _wallsViewPresenter.GetProfile(int.Parse(_userData.Profile))を待つメソッドを呼び出した後、'コードが応答しなくなったとプログレス作品(隠してない) –
を続け@ IgorLevkivskiy:あなたの "非同期"メソッドのようなサウンドは実際には同期しています。その場合、速く修正するのは、中間の4行のコードを '待つTask.Run(()=> {'...'}); 'の中にラップすることです。 –