android片段何时创建和处置非托管资源

时间:2019-06-27 14:18:35

标签: android android-fragments xamarin.android

我在片段内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时,将放置计时器。

我应该在哪个片段方法中实例化非托管资源(onstart,oncreateview,onResume ...)以及何时处置它(onStop,onpause,onDestroy ...),所以我没有创建多个计时器(泄漏) )? 正确的方法是什么?

1 个答案:

答案 0 :(得分:0)

正如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();
}