фрагмент Android, когда создавать и распоряжаться неуправляемыми ресурсами - PullRequest
0 голосов
/ 27 июня 2019

Я использую System.Threading.Timer в событии Textaged для Searchview внутри фрагмента.

    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 голосов
/ 28 июня 2019

Как сказано в 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() Method. И позже контролировать его, используя другой метод.

 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...