2011-02-05 4 views
0

У меня есть деятельность, которая включает в себя декларациюобращающихся значений массива по классам

public String progressArray[][] = new String[3][3] 

В другом файле (услуга) Я хочу, чтобы получить доступ к значениям этого массива. Я код:

ListViewLoader lvl = new ListViewLoader 

Теперь я считаю, что lvl.progressArray[0][0] возвращает нуль, хотя я знаю, что данные попали в него в своем классе. Это потому, что новый экземпляр не содержит значений оригинала, если да, то как я могу получить доступ к значениям в оригинале?

ответ

0

Ваше решение не работает, потому что progressArray является переменной экземпляра и при вызове

ListViewLoader lvl = new ListViewLoader 

, который создает новый экземпляр с progressArray установлен в значение по умолчанию (NULL в этом случае). Создание progressArray static может быть быстрым решением, но помните, что вы будете сильно зависеть от порядка, в котором активность и служба будут обращаться к этому массиву и могут быть сброшены, когда ваша деятельность будет уничтожена системой. Я сильно отговариваю вас от этого.Вместо этого, пожалуйста, рассмотреть вопрос о расширении Application class и реализации списка инициализации/доступ там, как:

public class MyApplication extends Application { 
    public String progressArray[][] = new String[3][3]; 
} 

Тогда объявим его в AndroidManifest как:

<application 
      android:name=".MyApplication" 
      android:label="@string/app_name" 
      android:icon="@drawable/icon"> 

Тогда как от вашей деятельности и услуг, которые вы можете получить, что, позвонив по телефону

((MyApplication) getApplication()).progressArray 

Это единственный способ разделить состояние между действиями и услугами в одном приложении, о котором я знаю, ng, отправляя сообщения туда и обратно, чтобы сохранить согласованное состояние (что может быть нетривиальной задачей) и не использовать синглтоны (which is anti-pattern as you probably know).

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

+0

Спасибо, что выяснил мой доступ к путанице. Я снова посмотрел на дизайн. Часть моей проблемы заключалась в том, что я дождался периода, когда – ron

+0

Ooops продолжил период сна, который оказался ненадежным, и поэтому я пытался использовать всевозможные альтернативы. Наконец, я остановился на повторяющемся сигнале тревоги, который кажется надежным и слушателем, который находится в том же классе, что и массив, так что теперь у меня есть доступ к исходному экземпляру. Еще раз спасибо за разъяснение re access, очень полезно – ron

0

Если вы ожидаете, что Служба всегда будет запущена этим Управлением, вы можете отправить данные String в Службу, используя намерение, которое запускает Сервис. Это достигается с помощью методов putExtra и getExtra:

Intent serviceIntent = new Intent(this, myService.class); 
serviceIntent.putExtra("pa_0_0", progressArray[0][0]); 
serviceIntent.putExtra("pa_0_1", progressArray[0][1]); 
//... 
serviceIntent.putExtra("pa_2_2", progressArray[2][2]); 
startService(serviceIntent); 

Вы можете получить Струны обратно снова в вашей службе, перекрывая его метод onStartCommand, который включает в себя намерение, который начал службу в качестве параметра.

progressArrayCopy[0][0] = mIntent.getStringExtra("pa_0_0"); 
+0

Спасибо - я должен был объяснить, что предпочитаю иметь прямой доступ к исходному экземпляру, созданному onCreate в классе. У меня есть какая-то туманная идея, что, может быть, контекст - это путь, но если так, я не могу понять, как заставить его работать на меня. – ron

0

Хмм ... звучит скорее как проблема программирования, а не связанная с Android. Если у вас есть класс, и у вас есть объявление массива, как в вашем случае выше, любой новый экземпляр этого класса не будет содержать новый экземпляр этого массива. Скажем, у вас есть класс, который используется каким-либо другим классом, и вы устанавливаете его значение как class.progressArray[0][0] = ..., а затем в каком-то другом классе вы хотите получить доступ к этим сохраненным значениям. должен иметьтот же экземпляр этого класса, чтобы вернуть сохраненные значения.

Обычно в программировании у Вас есть различные возможности:

  • вы передаете, что созданный экземпляр, содержащий данные вокруг, т.е. через конструктор или какой-либо способ общественного сеттер или
  • вы создаете/статическое свойство статического класса на этот класс будет одинаковым во всех случаях (предостережение)
  • вы создаете singleton, то есть будет только один экземпляр на протяжении всего жизненного цикла приложения.
Смежные вопросы