Статические объекты в деятельности недоступны из службы :( - PullRequest
0 голосов
/ 20 июля 2011

У меня проблема: я хочу использовать статические объекты в нескольких активностях и сервисе (в дополнительном процессе). К сожалению, сервис не получает объекты из активности и наоборот. Я пытаюсь упростить мою проблему в примерах кода:

Деятельность "main":

public static myObject o1;
public static myObject o2;

public void onCreate(Bundle savedInstanceState) {
     o1 = new myObject("someParameter");
}

Сервис "myService":

private myObject o1;
private myObject o2;

public void onCreate() {
   this.o1 = main.o1;
   this.o2 = main.o2;

   this.o2 = new myObject("someOtherParameter");
}

Теперь проблема: для основной активности (и всех других активностей) o2 всегда равно нулю (хотя и устанавливается вместе со службой). Для службы o1 всегда равно нулю (хотя установлено в main) :( Но если я правильно понял Java-объекты, это не должно не так, я прав?

Есть идеи, где может быть проблема?

Ответы [ 4 ]

0 голосов
/ 17 ноября 2013

Проблема не с Java, а с Android.Android не позволяет вам получить доступ к переменным другого процесса.Просто удалите атрибут android: process из службы в файле манифеста, чтобы служба работала в том же процессе, в котором выполняется ваша деятельность.

0 голосов
/ 20 июля 2011

Причина, по которой это не удается, заключается в том, что вы устанавливаете this.o2 для новой ссылки на объект.В этой программе у вас есть четыре ссылки и два объекта.

main.o1 -> OBJECT1
main.o2 -> NULL

В начале программы.

В строке this.o2 = main.o2 вы устанавливаете this.o2 как ссылку на main.o2.Итак, теперь у вас есть:

this.o2 -> main.o2 -> NULL

В строке this.o2 = new myObject("Something");, this.o2 теперь все вместе ссылается на новый объект.Это дает вам:

this.o2 -> OBJECT2
main.o2 -> NULL

Измените последнюю строку на main.o2 -> new myObject("Something");, вы получите:

this.o2 -> main.o2 -> OBJECT2

Обратите внимание, это все считается плохой практикой кодирования.Вы никогда не хотите менять статическую переменную из класса.Кроме того, в Android вы, как правило, не хотите получать доступ к вызову действия, подобного этому.

0 голосов
/ 20 июля 2011

Как говорит DeeV, использование статики таким образом не является хорошей практикой, но если вам абсолютно необходимо сделать это, то помещение их в ваш класс Application в некоторой степени содержит беспорядок.

Классы, производные от Context (например, Service и Activity), поддерживают метод getApplication () или getApplicationContext (), который необходимо преобразовать в класс приложения для доступа к переменным.

public class MyApplication extends Application {
       public static myObject o1; 
       public static myObject o2; 
}

public class MyActivity extends Activity {
       public void onCreate(Bundle state) {
              myObject o1 = ((MyApplication) getApplication()).o1;
              }
}

public class MyService extends Service {
       public void onCreate(Bundle state) {
              myObject o2 = ((MyApplication) getApplication()).o2;
              }
}

Помните, что вам придется синхронизировать доступ к переменным из разных потоков.

0 голосов
/ 20 июля 2011

вы можете добавить модификатор static к o1, o2 из класса обслуживания, но вы можете использовать непосредственно те из основного, почему вы хотите сделать копию?Использование статических объектов в Android помогает кешировать и держать их в одном классе

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