Обработка сообщений строго связана с Android . Но на самом деле вы не хотите отправлять сообщение обработчику. На самом деле вы запускаете код только в этом потоке. Таким образом, вместо того, чтобы использовать сообщения, которые вы делаете, вы должны просто позвонить post(Runnable)
:
val uiThreadHandler = Handler(Looper.getMainLooper())
uiThreadHandler.post {
...
}
Чтобы абстрагировать это еще дальше, вы можете использовать Kotlin Coroutines с расширением Android для Dispatchers.Main
:
GlobalScrope.launch(Dispatchers.Main) {
...
}
Блок будет запланирован в главном потоке Android . Если вы ничего не приостанавливаете в самом блоке, что может иметь место из-за того, что вы не используете сопрограмм прямо сейчас, вам не нужно беспокоиться об отмене Job
возвращается из launch
.
Похоже, я решил вернуть IEnumerable с клонированными объектами.
public IEnumerable<Foose> GetFooseList() {
foreach(var foos in Collection) {
yield return foos.Clone();
}
}
Это не позволяет изменять коллекцию. Помните, что ReadonlyCollection "дырявый", поскольку объекты внутри него могут быть изменены, как указано в ссылке в другом сообщении.
Можно сделать "foos" ReadOnlyCollection как это:
ReadOnlyCollection<T> readOnlyCollection = foos.ToList<T>().AsReadOnly();
Затем можно выставить его как свойство класса.
Править:
class FooContainer
{
private ICollection<Foo> foos;
public ReadOnlyCollection<Foo> ReadOnlyFoos { get { return foos.ToList<Foo>().AsReadOnly();} }
}
Примечание: Необходимо помнить, что, после того как Вы получаете набор ReadOnlyFoos, больше не "синхронизируется" с Вашим foos ICollection. Посмотрите поток, на который Вы сослались.
Моя рекомендация состоит в том, чтобы возвратиться, используют ReadOnlyCollection <T> для сценария непосредственно. Это делает использование явным вызывающему абоненту.
Обычно я предложил бы использовать соответствующий интерфейс. Но, учитывая, что Платформа.NET в настоящее время не имеет подходящего IReadOnlyCollection, необходимо пойти с типом ReadOnlyCollection.
Также необходимо знать при использовании ReadOnlyCollection, потому что это не на самом деле только для чтения: Неизменность и ReadOnlyCollection
Иногда можно хотеть использовать интерфейс, возможно, потому что Вы хотите дразнить набор во время поблочного тестирования. См. мою запись в блоге для добавления Вашего собственного интерфейса к ReadonlyCollection при помощи адаптера.
Я обычно возвращаюсь IEnumerable<T>
.
После того как Вы делаете набор только для чтения (так методы как Add
, Remove
и Clear
больше работа), там не много остается, что набор поддерживает это, счетное не делает - просто Count
и Contains
, Я верю.
Если потребители Вашего класса действительно должны рассматривать элементы как, они находятся в наборе, достаточно легко передать IEnumerable
кому: List<T>
конструктор.
Возвратите T []:
private ICollection<T> items;
public T[] Items
{
get { return new List<T>(items).ToArray(); }
}