2015-11-27 22 views
6

Chciałbym użyć Androids nowy JobScheduler w mojej aplikacji, ale w tej chwili nie wiem, jak przekazać mój obiekt, który zawiera dane (tablica byte), które powinny być wysłane przez sieć przez zadanie. Szukałem odpowiedzi, ale do tej pory nie znalazłem. Obawiam się.Android JobScheduling - muszę przekazać obiekt do mojej pracy, ale jak?

Mam 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); 
     } 
    } 
} 

... buduję pracę tak:

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 (praca);

... i jestem planowania pracy:

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

taaak ... nie mogę nazwać żadnych metod w MyJob bezpośrednio, prawda? Wtedy pomyślałem, że mogę użyć .setExtras(bundle), aby przekazać mój obiekt do pracy, ale jak się dowiedziałem, możesz użyć tylko PersistableBundle, który nie bierze serializowanego obiektu, takiego jak Pakiet. Ustawianie klawiszy i wartości nie działa, ponieważ możesz tylko wstawiać booleans, ints, strings itd., Ale nie byte[], czego właśnie potrzebuję.

Czy ktoś ma pomysł? Utknąłem.

Dzięki z góry, a-m

PS: Przepraszam, czy ja prawdopodobnie nie użyć prawego Tagi kodu.

+0

To nie jest związany konkretnie do przejścia obiekty do 'JobInfo'. Chodzi o użycie 'Intent' do przekazywania obiektów pomiędzy dowolnymi dwoma elementami systemu Android, ** dostępne opcje zostały szczegółowo omówione w [to pytanie] (https://stackoverflow.com/q/2139134/2666212) **. – Mike

Odpowiedz

2

OK - odpowiem sobie.

Wygląda na to, że przekazywanie do obiektu JobService obiektów bardziej złożonych niż String, ints itp. Nie jest możliwe z powodu trwałości (kod mógł ulec zmianie, a nie klasy nie będą mogły pracować ze starymi danymi). To oczywiście ma sens, ale myślę, że z tym ograniczeniem bardzo trudno jest użyć funkcji JobScheduling.

My „rozwiązanie” teraz jest uratowanie obiektu w pliku i przekazać nazwę pliku poprzez

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

W moim JobService Czytam ten plik i przesyłam To dane za pośrednictwem sieci. Może to nie jest naprawdę eleganckie, ale nie mogę wymyślić innego (lepszego) sposobu. Może to pomaga komuś.

7

Wiem, że to stare pytanie, ale zostawię moje rozwiązanie każdemu, kto uzna to za przydatne.

Pierwszy Odwracam obiektu do JSON przy użyciu Google Gson bibliotekę

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

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

Następnie należy pobrać ciąg z wiązki i deserializowania

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