Нужно ли мне скопировать статические объекты, если я хочу получить доступ к ним из асинктрязки?
-
28-09-2019 - |
Вопрос
У меня есть проект, который использует AsyncTask
Чтобы получить работу сделано в фоновом режиме.
Этот проект также использует класс в качестве универсального держателя для статических значений, таких как ключи базы данных, но также для одного или двух полезных объектов для всего проекта. Допустим, этот класс называется public class Constants
.
Я хочу получить доступ к одному из этих объектов из AsyncTask
, И я не знаю, нужно ли мне скопировать это или нет.
Я на самом деле не получаю ошибок или сбоев, но я получаю несколько сообщений о отзывах пользователей, которые я не могу воспроизвести, поэтому я влюблен, я делаю что-то не так с этим.
Моя текущая обработка это:
onStart() {// somewhere in the UI thread
new MyTask(Constants.theObject).execute(); // (1)
}
// ...
class MyTask extends AsyncTask<...> {
MyObjectType object;
MyTask(MyObjectType theObjectInstance) {
object = theObjectInstance; // (2)
// ...
doInBackground() { // (3)
// ...
}
В (1)
, Constants.theObject
является статическим объектом, созданным при запуске приложения
В (2)
, Я получаю ссылку на существующий статический объект Constants.theObject
В (3)
, мы больше не в пользовательской интерфейсе UI, и я хочу получить доступ к Constants.theObject
(который также может быть использован в главной ните)
.
Я думаю, что есть три возможных случая.
- Этот код некрасиво, я должен сделать иначе
- Этот код в порядке, отзывы пользователя не об этом
- Этот код совсем в порядке, но я должен сделать копию
Constants.theObject
Если я хочу использовать его вdoInBackground
; в противном случае это может потерпеть неудачу
Я надеюсь, что вы можете помочь мне! Спасибо много для чтения.
Решение
Из чего вы написали, я не думаю, что вам нужно сделать копию, если только MyObjectType
Это не безопасно в потоке, в этом случае необходимо убедиться, что только 1 поток за раз модифицирует его / это неремотные методы. (Выполнение копии действительно решат это, но если вы можете сделать копию, это глобальный статический действительно то, что вы должны использовать в любом случае?)
Вы на 100% уверены, что 1 и 3 могут произойти только после инициализации объекта?
Другие советы
Это может быть, потому что более одного потока пытаются изменить один и тот же объект. Это может вызвать неожиданные результаты / полную неудачу. Вы можете использовать некоторое замок, чтобы не могли обновлять объект одновременно. Этот случай он замедляет ваши асинч-операции, поскольку все они зависят от точного определения. Я предполагаю, что вы используете статический объект по причине, вы можете по возможности рассмотреть это, если это возможно.