Нужно ли копировать статические объекты, если я хочу получить к ним доступ из AsyncTask? - PullRequest
1 голос
/ 02 ноября 2010

У меня есть проект, который использует 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) мы больше не в потоке пользовательского интерфейса, и я хочу получить доступ к Constants.theObject (который также может использоваться в основном потоке)

.

Я думаю, что есть три возможных случая.

  • этот код некрасив, я должен сделать иначе
  • с этим кодом все в порядке, отзывы пользователей не об этом
  • этот код вполне подходит, но я должен сделать копию Constants.theObject, если я хочу использовать его в doInBackground; в противном случае может произойти сбой

Надеюсь, вы мне поможете! Большое спасибо за чтение.

Ответы [ 2 ]

0 голосов
/ 02 ноября 2010

Из того, что вы написали, я не думаю, что вам нужно делать копию, если MyObjectType НЕ является поточно-ориентированным, в этом случае вам нужно убедиться, что только 1 поток за раз модифицирует его/ это-не-потокобезопасная-метода.(Создание копии действительно решило бы это, но если вы можете сделать копию, действительно ли вам в любом случае следует использовать глобальную статичность?)

Вы на 100% уверены, что 1 и 3 возможны только ПОСЛЕобъект был инициализирован?

0 голосов
/ 02 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...