【问题标题】:android fragment when to create and dispose unmanaged resourcesandroid片段何时创建和处置非托管资源
【发布时间】:2019-06-27 14:18:35
【问题描述】:

我在片段内 Searchview 的 Textchanged 事件中使用 System.Threading.Timer。

    System.Threading.Timer _timer;
    private void SearchView_QueryTextChange(object sender, Android.Support.V7.Widget.SearchView.QueryTextChangeEventArgs e)
    {
        _timer.Change(300, Timeout.Infinite);
        ...
        ...
    }

    public override void OnResume()
    {
        _timer = new System.Threading.Timer(MyCallBack);
        base.OnResume();
    }

    public override void OnPause()
    {
        _timer.Dispose();
        base.OnPause();
    }

我在调用 onResume 时实例化计时器,并在调用 onPause 时释放(释放资源)它。 问题是,如果我单击“主页”按钮,计时器将被释放(onPause),但在再次单击应用程序后,不会调用 onResume。当我尝试在 searchView 中输入时,计时器被释放。

我应该在 Fragment 的哪个方法中实例化非托管资源(onstart、oncreateview、onResume...)以及何时释放它(onStop、onpause、onDestroy...),所以我不会创建多个计时器(泄漏)? 正确的方法是什么?

【问题讨论】:

  • onStart/onStop 是一个更安全的选择,尽管它取决于你的计时器在做什么。如果将应用程序置于后台,它应该停止吗?因为如果不是,那么onViewCreated/onDestroyView.
  • @EpicPandaForce 谢谢。当我在搜索视图框中输入时,我使用计时器产生一个小的延迟。它不应该在应用不可见后执行。
  • 那就是onStart/onStop

标签: android android-fragments xamarin.android


【解决方案1】:

正如 EpicPandaForce 所说,onStart/onStop 是更好的方法。

为了安全,从您的代码中多次进入Avtivity时,_timer可能会重复创建。如下编码将是安全的。

public override void OnResume()/OnStart()
{
    if(null != _timer)
    {
         _timer = new System.Threading.Timer(MyCallBack);
         base.OnResume();
    }
}

public override void OnPause()/OnStop()
{
    if(null != _timer)
    {
       _timer.Dispose();       
    }
    base.OnPause();
}

建议使用另一个 (System.Timers.Timer) 定时器。您可以在OnCreate() 方法中创建一次。稍后在其他方法中使用它进行控制。

 System.Timers.Timer timer

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);

    timer = new System.Timers.Timer();
    timer.Interval = 3000;
    timer.Enabled = true;
    timer.AutoReset = true;
    timer.Elapsed += (object sender, System.Timers.ElapsedEventArgs e) =>
    {
        //Do something
    };
}

public override void OnResume()/OnStart()
{
    timer.Start();
    base.OnResume();
}

public override void OnPause()/OnStop()
{
    timer.Stop();
    base.OnPause();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-06
    相关资源
    最近更新 更多