我在片段内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 ...),所以我没有创建多个计时器(泄漏) )? 正确的方法是什么?
答案 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();
}