2015-11-27 15 views
6

Vorrei utilizzare il nuovo JobScheduler di Androids nella mia app, ma al momento non so come passare il mio oggetto che contiene i dati (array byte) che dovrebbe essere inviato via rete da un lavoro. Ho cercato una risposta ma finora non ho trovato nessuno di cui abbia paura.JobScheduling Android - Devo passare un oggetto al mio lavoro ma come?

Ho un 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); 
     } 
    } 
} 

... sono la costruzione di un lavoro come questo:

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 (di lavoro);

... e sto pianificazione del processo:

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

Sooo ... non riesco a chiamare qualsiasi metodo di MyJob direttamente, giusto? Poi ho pensato che avrei potuto usare .setExtras(bundle) per passare il mio oggetto al lavoro, ma come ho scoperto puoi usare solo uno PersistableBundle che non accetta un oggetto serializzato come Bundle. L'impostazione di chiavi e valori non funziona, perché è possibile inserire solo booleans, ints, strings, ecc. Ma non byte[], che è ciò di cui ho bisogno.

Qualcuno ha qualche idea? Sono abbastanza bloccato

Grazie in anticipo, a-m

PS: Siamo spiacenti, se probabilmente non ha utilizzato a destra codice-Tag.

+0

Questo non è legato specificamente a scomparsa oggetti a 'JobInfo'. Si tratta di utilizzare un 'Intento' per passare oggetti tra due qualsiasi componenti di Android, ** le opzioni disponibili sono state discusse in dettaglio in [questa domanda] (https://stackoverflow.com/q/2139134/2666212) **. – Mike

risposta

2

Ok - risponderò a me stesso.

Sembra che passare oggetti più complessi di String, ints, ecc. A un JobService non sia possibile a causa di motivi di persistenza (il codice potrebbe essere cambiato e non le classi non saranno in grado di lavorare con i vecchi dati). Ovviamente questo ha senso, ma penso che con questa restrizione sia molto difficile usare JobScheduling.

La mia "soluzione" ora è salvare il mio oggetto in un file e passare il nome del file tramite

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

Nel mio JobService sto leggendo il file e mando di dati via rete. Forse non è molto elegante, ma non riesco a pensare ad un altro (migliore) modo. Forse questo aiuta qualcuno.

7

So che è una vecchia domanda, ma lascerò la mia soluzione per chiunque la trovi utile.

Prima mi rivolgo il mio oggetto in JSON utilizzando Google Gson biblioteca

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

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

Poi si recupera la stringa dal fascio e deserializzare

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