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; 
      }); 
     }; 
    } 

答えて

0

ContinueWithは非常に危険な、低レベルのAPIです。ここでは使用しないでください。また、async/awaitとすると、RunOnUIThreadの必要はありません。

呼び出しているメソッドが既に非同期であるため、Task.Runは不要です。

簡体字版:

protected override async 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); 
    profile = await _wallsViewPresenter.GetProfile(int.Parse(_userData.Profile)); 
    WallModel wall = SerializationService.DeSerialize<WallModel>(profile.Wall); 
    _posts = (List<PostModel>) (wall.Posts.ToList());       

    progressBar.Visibility = ViewStates.Gone; 
    _postListAdapter = new PostListAdapter(this, _posts); 
    _listView.Adapter = _postListAdapter; 
    SetListViewHeader(); 
    _listView.AddHeaderView(_header); 
    FindViewById<TextView>(Resource.Id.details).Text = profile.Name; 
} 
+0

おかげではなく、 'プロファイルは= _wallsViewPresenter.GetProfile(int.Parse(_userData.Profile))を待つメソッドを呼び出した後、'コードが応答しなくなったとプログレス作品(隠してない) –

+1

を続け@ IgorLevkivskiy:あなたの "非同期"メソッドのようなサウンドは実際には同期しています。その場合、速く修正するのは、中間の4行のコードを '待つTask.Run(()=> {'...'}); 'の中にラップすることです。 –

関連する問題