0

メインスレッドをブロックしていない非同期アニメーションを実行しようとしています。私がやろうとしています シナリオ:ノンブロッキングUIスレッドアニメーション

  • ユーザーがボタンをクリックすると、いくつかの時間後のViewModelプロパティ は、その状態が変化します。

  • MvxFragmentビューで私はOnPropertyChangedイベントを購読しています。希望のプロパティが変更された場合は、アニメーションを実行します( への通知を数秒間表示します)。

は、私はアニメーションが進行中であるときにアプリが応答しないで立ち往生しています:私もアニメーション非同期に実行するためのさまざまな方法を試してみましたが、それらのどれも働いた

public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{ 
    var ignore = base.OnCreateView(inflater, container, savedInstanceState); 

    var view = this.BindingInflate(Resource.Layout.MyView, null); 
    ViewModel.WeakSubscribe(PropertyChanged); 

    return view; 
} 

private void PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    if (e.PropertyName == "IsSaved") 
    { 
     if (ViewModel.IsSaved) 
     { 
      ShowSavedPopup(); 
     } 
    } 
} 

private void ShowSavedPopup() 
{  
    var dispatcher = Mvx.Resolve<IMvxMainThreadDispatcher>(); 
    dispatcher.RequestMainThreadAction(() => 
    { 

     var popupView = View.FindViewById(Resource.Id.popup); 
     popupView.Alpha = 0.0f; 

     popupView.Animate() 
      .SetDuration(4000) 
      .Alpha(1f))); 
    }); 
} 

(、Task.Runを待ちますActivity.RunOnUiThread ..)。

アニメーションを非同期で実行するにはどうすればよいですか?

答えて

0

貧しい私の英語を謝っています。

私は醸造のためのアニメーションシナリオの最終行を削除しましたが、問題はそこに隠されていました。 私の場合、問題はThread.Sleepの使用にありました。

これは、メインのUIスレッドをフリーズしました。

代わりに非同期タスクを使用する必要があります。 Task.Delayを使用して、必要な時間ポップアップを表示します。

作業溶液は次のようになります。

private async void ShowSavedPopup() 
{  
    // check if animation is in progress 
    if (_isBusy) return; 

    _isBusy = true; 

    await Task.Factory.StartNew(() => 
    { 
     _popupView.Post(() => 
     { 
      _popupView.Visibility = ViewStates.Visible; 
      _popupView.Alpha = 0.0f; 

      _popupView.Animate() 
       .SetDuration(400) 
       .Alpha(1f) 
       .WithEndAction(new Runnable(async() => 
       { 
        await Task.Delay(2000); 

        _popupView.Animate() 
         .SetDuration(400) 
         .Alpha(0.0f) 
         .WithEndAction(new Runnable(() => { 
          _popupView.Visibility = ViewStates.Gone; 
          isBusy = false; 
         })); 
       })); 
     }); 
    }); 
} 
関連する問題