доступ к значениям массива между классами - PullRequest
0 голосов
/ 05 февраля 2011

У меня есть действие, которое включает объявление

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

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

ListViewLoader lvl = new ListViewLoader

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

Ответы [ 3 ]

0 голосов
/ 05 февраля 2011

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

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

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

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

ListViewLoader lvl = new ListViewLoader

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

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

Это единственный способ поделиться состоянием между действиями и службами в рамках одного приложения, о котором я знаю, и не включая отправку сообщений туда и обратно всохраняйте согласованность состояний (что может быть нетривиальной задачей) и не используйте синглтоны (, что, как вы, вероятно, знаете, ).

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

0 голосов
/ 05 февраля 2011

Если вы ожидаете, что Сервис будет всегда запускаться этим Актом, вы можете отправить Строковые данные в Сервис, используя намерение, которое запускает Сервис. Вы достигаете этого, используя методы 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" );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...