Android JobScheduling - мне нужно передать объект на мою работу, но как?

Я хотел бы использовать андроиды новый JobScheduler в моем приложении, но прямо сейчас я не знаю, как передать мой объект, который содержит данные (byte array), который должен быть отправлен через сеть заданием. Я искал ответ, но пока ничего не нашел.

у меня есть JobService:

public class MyJob extends JobService {

    @Override
    public boolean onStartJob(JobParameters jobParameters) {
        new JobTask(this).execute(jobParameters);
        return true;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        return false;
    }

    private static class JobTask extends AsyncTask<JobParameters, Void,       JobParameters> {
        private final JobService jobService;

        public JobTask(JobService jobService) {
            this.jobService = jobService;
        }

        @Override
        protected JobParameters doInBackground(JobParameters... params) {
            AnotherClass.post(myObject); // where does myObject come from?
            return params[0];
        }

        @Override
        protected void onPostExecute(JobParameters jobParameters) {
            jobService.jobFinished(jobParameters, false);
        }
    }
}

... я строю такую работу:

PersistableBundle bundle = new PersistableBundle();
JobInfo job = new JobInfo.Builder(jobID, new ComponentName(context, AshServiceJob.class))
              .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
              .setPersisted(true)
              .setExtras(bundle)  // could bundle somehow contain myObject?
              .build();

OtherClass.addJobInBackground (работа);

... и планирую Иов:

public void addJobInBackground(final JobInfo job) {
        JobScheduler jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
        jobScheduler.schedule(job);
    }

ооочень ... Я не могу напрямую вызывать методы в моей работе, верно? Тогда я подумал, что могу использовать .setExtras(bundle) передать мой объект на работу, но, как я узнал, вы можете использовать только PersistableBundle который не будет принимать сериализованный объект, такой как Bundle. Установка ключей и значений не работает, потому что вы можете только поставить booleans, ints, strings, etc. но не byte[], что мне нужно.

кто-нибудь какие-нибудь идеи? Я застрял.

спасибо заранее, а-м

PS: извините, если бы я не использовал правильные кодовые метки.

2 ответов


Я знаю, что это старый вопрос, но я оставлю свое решение для тех, кто найдет его полезным.

сначала я превращаю свой объект в json с помощью Google Gson библиотека

MyCustomObject myObj = new MyCustomObject("data1", 123);
Gson g = new Gson();
String json = g.toJson(myObj);

PersistableBundle bundle = new PersistableBundle();
bundle.putString("MyObject", json);

затем извлечь строку из пакета и десериализовать

String json = params.getExtras().getString("MyObject");
Gson g = new Gson();
MyCustomObject myObj = g.fromJson(json, MyCustomObject.class);

Ok-Я отвечу сам.

Кажется, что передача более сложных объектов, чем строка, ints и т. д. к JobService невозможно из-за причин сохранения (код мог измениться и не классы не смогут работать со старыми данными). Это, конечно, имеет смысл, но я думаю, что с этим ограничением очень сложно использовать JobScheduling.

мое "решение" теперь сохраняет мой объект в файле и передает имя файла через

PersistableBundle bundle = new PersistableBundle();
bundle.putString("filename", object.getFilename());

в моем JobService я читаю этот файл и отправляю его данные через сеть. Возможно, это не очень элегантно, но я не могу придумать другой (лучший) способ. Может, это кому-то поможет.