Нестатические поля / свойства сервиса зависимостей Xamarin.Forms - PullRequest
0 голосов
/ 10 декабря 2018

Я использую Dependency Service, чтобы получить специфическую для платформы реализацию интерфейса.Допустим, у меня есть следующий интерфейс:

public interface IMyInterface
{
    bool IsEnabled { get; set; }
}

И класс реализации в моем проекте Android:

[assembly: Dependency(typeof(MyClass))]
namespace App.Droid
{
    class MyClass : IMyInterface
    {
        public bool IsEnabled { get; set; }
    }
} 

В какой-то момент кода я установил IsEnabled в true.

После этого я запускаю новое действие, которое переводит мое приложение в фоновый режим:

Intent intent = new Intent();
intent.SetAction(action);
intent.SetFlags(ActivityFlags.NewTask);

MainActivity.Instance.StartActivity(intent);

Когда мое приложение возвращается на передний план, я получаю доступ к свойству IsEnabled и получаюfalse вместо true.Это на самом деле происходит с каждым отдельным свойством и приватным полем класса, в котором он находится.Собираются ли эти свойства мусором, когда я покидаю приложение для нового действия?

Единственный способ, который я нашел, чтобы решить эту проблему, это сделать все вспомогательные поля static, но это приводит к большим накладным расходам в коде, что может быть ненужным, если бы я знал причины этого поведения.

1 Ответ

0 голосов
/ 11 декабря 2018

Не слишком понимая название вашего вопроса.

Если вы используете шаблон синглтона, вы можете извлекать свойства, основываясь на уникальном объекте создания экземпляра, когда это необходимо. Например:

public class Singleton
    {
        // Define a static variable to hold an instance of the class
        private static Singleton uniqueInstance;

        // Define a private constructor so that the outside world cannot create instances of the class
        private Singleton()
        {
        }

        /// <summary>
        /// Define public methods to provide a global access point, and you can also define public properties to provide global access points
        /// </summary>
        /// <returns></returns>
        public static Singleton GetInstance()
        {
            // Create if the instance of the class does not exist, otherwise return directly
            if (uniqueInstance == null)
            {
                uniqueInstance = new Singleton();
            }
            return uniqueInstance;
        }
    }

Если не , вы можете использовать Properties (https://docs.microsoft.com/en-us/dotnet/api/xamarin.forms.application.properties?view=xamarin-forms)to для доступа к данным. Нравится это:

private void SaveConnectionData(JSON.Connection C)
                    {
                        App.Current.Properties[Cryptography.Encryption("AccessToken")] = Cryptography.Encryption(C.Access_token);
                        App.Current.Properties[Cryptography.Encryption("ExpiresIn")] = Cryptography.Encryption(C.Expires_in.ToString());
                        App.Current.Properties[Cryptography.Encryption("TokenType")] = Cryptography.Encryption(C.Token_type);
                        App.Current.Properties[Cryptography.Encryption("Scope")] = Cryptography.Encryption(JsonConvert.SerializeObject(C.Scope));
                        App.Current.Properties[Cryptography.Encryption("RefreshToken")] = Cryptography.Encryption(C.Refresh_token);
                        App.Current.SavePropertiesAsync();
                    }

Возможно, вы участвуете виспользование lifecycles и notifications. Также, если данных много, рассмотрите возможность использования базы данных SQLite для сохранения этих данных. См. эту ссылку здесь

Подробнее : В Xamarin.Android вы также можете попробовать lifecycles, чтобы показать сохраненные данные. Как и OnResume метод, чтобы показать данные.

...