2017-12-11 17 views
1

他のクラスからのイベントによって進捗値が送信される、ロードページで進行状況を表示するXamarin.Forms Androidアプリがあります。Xamarin.Formsアンドロイドアプリ - PageModelが登録解除されているにもかかわらず参照されているPageModelを維持する

PageModelで使用できるViewIsAppearingとViewIsDisappearingオーバーライドを持つFreshMvvmを使用しています。

私たちはViewIsAppearingに登録しており、ViewIsDisappearingで購読を取り消しています.PreleaseForDisposeメソッドは、PageModelがきれいになって処分できるようにするためのものです。

コードは以下のとおりです。 ProgressManagerは、IOCが供給されている

 protected override void ViewIsAppearing (object sender, EventArgs e) 
     { 
      base.ViewIsAppearing (sender, e); 

      ProgressManager.ProgressEvent += ProgressManager_ProgressEvent; 

     } 

     protected override void ViewIsDisappearing (object sender, EventArgs e) 
     { 
      base.ViewIsDisappearing (sender, e); 

      RemoveEventHandlers(); 
     } 

     public override void PrepareForDispose() 
     { 
      RemoveEventHandlers(); 
      base.PrepareForDispose(); 
     } 

     private void RemoveEventHandlers() 
     { 
      ProgressManager.ProgressEvent -= ProgressManager_ProgressEvent; 
     } 

問題がプロファイラーでオブジェクトを調べるとき、私たちは「パスを調べる(なぜならViewIsAppearingで作成のEventArgsの、LoadingPageModelがメモリに残っている見ることができる、ということですProfilerの "To Root"はこれを私たちに伝えています)。

アプリをログ/デバッグすると、RemoveEventHandlersが呼び出されました。

_ProgressManager.ProgressEvent - = ProgressManager_ProgressEvent; _ハンドラを削除できませんでしたか、またはEventArgsからPageModelへの参照がまだ残っているという別の理由がありますか?

を編集する可能性がありますが、複数回申し込みをしていますが、1度だけ購読を停止している可能性があります。私はデバッグ/ロギングでチェックしましたが、これは当てはまりません。対称的に購読/購読を停止しています。

答えて

0

アプリのライフサイクルの始めに問題のページのライフサイクルのために2回購読していました。したがって、単一の契約解除は、契約を遅らせることになりました。

これを修正すると問題が解決しました。