Нужно ли мне скопировать статические объекты, если я хочу получить доступ к ним из асинктрязки?

StackOverflow https://stackoverflow.com/questions/4079556

  •  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 могут произойти только после инициализации объекта?

Другие советы

Это может быть, потому что более одного потока пытаются изменить один и тот же объект. Это может вызвать неожиданные результаты / полную неудачу. Вы можете использовать некоторое замок, чтобы не могли обновлять объект одновременно. Этот случай он замедляет ваши асинч-операции, поскольку все они зависят от точного определения. Я предполагаю, что вы используете статический объект по причине, вы можете по возможности рассмотреть это, если это возможно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top