Передача объекта Parcelable, который имеет переменную-член Not Not parcelable (класс, принадлежащий сторонней библиотеке) - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь отправить объект класса (скажем, объект класса X) как часть класса, который реализует Parcelable. Проблема, с которой я здесь сталкиваюсь, заключается в том, что Class X является частью некоторой библиотеки, и я не могу отредактировать ее для реализации Parcelable или serializable.
Я проверил, что Class X не реализует Parcelable или сериализуемый, и мы также не можем изменить.
Ребята, не могли бы вы помочь мне здесь?

MainActivity:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Start the service.
        DummyParcelableObject mObj = new DummyParcelableObject(new RandomClass(2019));
        Intent serviceIntent = new Intent(MainActivity.this, SampleService.class);
        serviceIntent.putExtra("myObj", mObj);
        startService(serviceIntent);
    }
}

Класс Макетной посылки:

class DummyParcelableObject implements Parcelable {

    RandomClass mRandomClass;

    public DummyParcelableObject(RandomClass obj) {
        mRandomClass = obj;
    }

    protected DummyParcelableObject(Parcel in) {
        mRandomClass = (RandomClass) in.readValue(RandomClass.class.getClassLoader());
    }

    public static final Creator<DummyParcelableObject> CREATOR = new Creator<DummyParcelableObject>() {
        @Override
        public DummyParcelableObject createFromParcel(Parcel in) {
            return new DummyParcelableObject(in);
        }

        @Override
        public DummyParcelableObject[] newArray(int size) {
            return new DummyParcelableObject[size];
        }
    };

    public int getRandomVar() {
        int n = 0;

        if (mRandomClass != null)
        {
            System.out.println("Anil: DummyParcelableObject: if (mRandomClass != null) is true.\n");
            n = mRandomClass.getNumb();
        }
        else
        {
            System.out.println("Anil: DummyParcelableObject: if (mRandomClass != null) is false.\n");
        }

        return n;
    }

    @Override
    public int describeContents() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeValue(mRandomClass);
    }
}

Класс X, который является частью другой библиотеки:

class RandomClass{
    public static int cnt = 0;
    private int nRandomNumber = 0;
    public RandomClass(int n)
    {
        nRandomNumber = n;
    }

    public int getNumb()
    {
        return nRandomNumber;
    }
}

Служба, в которую нам нужно отправить данные:

public class SampleService extends Service {
    @Override
    public int onStartCommand(Intent intent, int flags, int startid) {
        DummyParcelableObject obj = intent.getParcelableExtra("mObj");
        if (obj == null) {
            System.out.println("\nAnil: ParcelableExtra is null");
        }
        else {
            System.out.println("\nAnil: ParcelableExtra is not null");
            System.out.println("\nAnil: obj.getRandomVar() = " + obj.getRandomVar());
        }

        return START_STICKY;
    }
}

1 Ответ

0 голосов
/ 10 июня 2019

Если вы не можете реализовать Parcelable или Serializable, остается только одна опция: пропуск объекта через глобальное состояние.

Использование статических полей

Добавление статического полявведите RandomClass до DummyParcelableObject, например, randomClassStatic.Установите его непосредственно перед запуском сервиса:

// Start the service.
DummyParcelableObject mObj = new DummyParcelableObject(new RandomClass(2019));
Intent serviceIntent = new Intent(MainActivity.this, SampleService.class);
serviceIntent.putExtra("myObj", mObj);
DummyParcelableObject.randomClassStatic = mObj.getRandomClass();
startService(serviceIntent);

Затем получите его сразу после запуска сервиса в onStartCommand():

DummyParcelableObject obj = intent.getParcelableExtra("mObj");
obj.setRandomClass(DummyParcelableObject.randomClassStatic);
DummyParcelableObject.randomClassStatic = null;

Вам необходимо определить getRandomClass() и setRandomClass() соответственно для получения / настройки mRandomClass.

Обратите внимание, что это не самое безопасное, что нужно сделать в отношении параллелизма, жизненных циклов объектов и т. д. *

Использование класса Application

Это можно использовать, только если у вас есть доступ к Activity или Service на обоих концах.

Подкласс Application и добавьте к нему поле типа RandomClass.Это будет служить реле.Определите публичные методы для получения / установки этого поля (например, getRandomClass() и setRandomClass()).Не забудьте указать свой подкласс Application в манифесте, как описано здесь .Перед запуском службы:

// Start the service.
DummyParcelableObject mObj = new DummyParcelableObject(new RandomClass(2019));
Intent serviceIntent = new Intent(MainActivity.this, SampleService.class);
serviceIntent.putExtra("myObj", mObj);
((MyApplication) getApplication()).setRandomClass(mObj.getRandomClass());
startService(serviceIntent);

Затем для извлечения объекта после запуска службы, все еще в onStartCommand():

DummyParcelableObject obj = intent.getParcelableExtra("mObj");
obj.setRandomClass(((MyApplication) getApplication()).getRandomClass());
DummyParcelableObject.randomClassStatic = null;

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

...