2015-11-27 22 views
6

मैं अपने ऐप में Androids new JobScheduler का उपयोग करना चाहता हूं लेकिन अभी मुझे नहीं पता कि मेरी ऑब्जेक्ट को कैसे पास किया जाए जिसमें डेटा (byte सरणी) शामिल है जिसे किसी नौकरी से नेटवर्क के माध्यम से भेजा जाना चाहिए। मैंने एक उत्तर खोजा लेकिन अब तक कोई भी मुझे डरता नहीं है।एंड्रॉइड जॉबशेड्यूलिंग - मुझे अपने काम पर ऑब्जेक्ट पास करने की ज़रूरत है लेकिन कैसे?

मैं एक 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); 
    } 

Sooo ... मैं सीधे सही MyJob में किसी भी तरीकों कॉल नहीं कर सकते? मैंने सोचा कि मैं नौकरी पर अपना ऑब्जेक्ट पास करने के लिए .setExtras(bundle) का उपयोग कर सकता हूं, लेकिन जैसा कि मैंने पाया है कि आप केवल PersistableBundle का उपयोग कर सकते हैं जो बंडल जैसे क्रमबद्ध ऑब्जेक्ट नहीं लेगा। कुंजी और मूल्य सेट करना काम नहीं करता है, क्योंकि आप केवल booleans, ints, strings इत्यादि डाल सकते हैं, लेकिन byte[] नहीं, जो मुझे चाहिए।

क्या किसी को कोई विचार है? मैं काफी अटक गया हूँ।

अग्रिम धन्यवाद, एक मीटर

पुनश्च: माफ करना, सही कोड-टैग करता है, तो मैं शायद का उपयोग नहीं किया।

+0

यह गुजर के लिए विशेष रूप बंधी नहीं है 'जॉबइन्फो' के लिए ऑब्जेक्ट्स। यह किसी भी दो एंड्रॉइड घटकों के बीच वस्तुओं को पारित करने के लिए 'इरादा' का उपयोग करने के बारे में है, ** उपलब्ध विकल्पों पर विस्तार से चर्चा की गई है [https://stackoverflow.com/q/2139134/2666212) **। – Mike

उत्तर

2

ठीक है - मैं खुद का जवाब दूंगा।

ऐसा लगता है कि एक नौकरी सेवा के लिए स्ट्रिंग, इन्ट्स इत्यादि की तुलना में अधिक जटिल वस्तुओं को पार करना निरंतर कारणों से संभव नहीं है (कोड बदल सकता है और कक्षा पुराने डेटा के साथ काम करने में सक्षम नहीं होगी)। बेशक यह समझ में आता है लेकिन मुझे लगता है कि उस प्रतिबंध के साथ जॉबशेड्यूलिंग का उपयोग करना बहुत मुश्किल है।

मेरे "समाधान" अब एक फ़ाइल में मेरी वस्तु बचत और के माध्यम से

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

फ़ाइल नाम पारित मेरी JobService में मैं उस फ़ाइल को पढ़ रहा हूँ और नेटवर्क के माध्यम से यह डेटा भेज रहा हूँ है। शायद यह वास्तव में सुरुचिपूर्ण नहीं है, लेकिन मैं एक और (बेहतर) तरीके से नहीं सोच सकता। शायद यह किसी की मदद करता है।

7

मुझे पता है कि यह एक पुराना सवाल है, लेकिन मैं इसे हल करने के लिए अपना समाधान छोड़ दूंगा।

सबसे पहले मैं गूगल Gson पुस्तकालय

का उपयोग कर json में मेरी वस्तु बारी
MyCustomObject myObj = new MyCustomObject("data1", 123); 
Gson g = new Gson(); 
String json = g.toJson(myObj); 

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

तो फिर तुम बंडल से स्ट्रिंग को पुनः प्राप्त और deserialize

String json = params.getExtras().getString("MyObject"); 
Gson g = new Gson(); 
MyCustomObject myObj = g.fromJson(json, MyCustomObject.class); 
संबंधित मुद्दे

 संबंधित मुद्दे