2016-11-01 6 views
12

का उपयोग कर आवर्ती नौकरी अनुसूची मैं हर 10 मिनट में एंड्रॉइड डिवाइस के स्थान को पोस्ट करने की कोशिश कर रहा हूं। मैं firebase कार्य प्रेषक उपयोग कर रहा हूँ इसफायरबेस जॉब डिस्पैचर

FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(this)); 
Job myJob = dispatcher.newJobBuilder() 
    .setService(UpdateLocationService.class) 
    .setRecurring(true) 
    .setTrigger(Trigger.executionWindow(10, 20)) 
    .setRetryStrategy(RetryStrategy.DEFAULT_LINEAR) 
    .setTag("location-update-job") 
    .setLifetime(Lifetime.FOREVER) 
    .build(); 
dispatcher.mustSchedule(myJob); 

UpdateLocationService स्थान हो जाता है और सर्वर को भेजता है क्या करना है।

मेरी समस्या: चीजें ज्यादातर ठीक काम कर रही हैं। केवल एक चीज है, नौकरियों को 4 मीटर, 6 मीटर, 7 मीटर, 8 मीटर, 10 मीटर, 16 मीटर, 23 मीटर के अंतर के साथ निर्धारित किया जा रहा है ...

क्या कोई मुझे जाने पर समझने में मदद कर सकता है।

अद्यतन: मैं 10-20 मिनट में एक बार स्थान चाहता हूं। उपर्युक्त कोड में, परीक्षण उद्देश्यों के लिए मूल्य बहुत कम है

+1

यदि नौकरी विफल हो जाती है तो मुझे लगता है कि बैकऑफ है। इसके अलावा मुझे विश्वास है कि उस सटीक पल पर दौड़ने की कोई गारंटी नहीं है। परिवर्तनीय प्रारंभ समय के साथ अपने बैकऑफ को जोड़ना समय के लिए जिम्मेदार होगा। क्या आपने सही बूलियन को 'ऑनस्टॉप जॉब()' में वापस कर दिया है? –

+0

@ kranthi117 क्या आपको इसका उत्तर मिला? –

+0

@SharpEdge अभी तक नहीं :( – kranthi117

उत्तर

1

ऐसा कुछ कारण हो सकता है कि यह क्यों हो रहा है। सबसे पहले आपकी नौकरी falseonStopJob() में लौट रही है? दस्तावेज़ों से

@Override 
public boolean onStopJob(JobParameters job) { 
    return false; // Answers the question: "Should this job be retried?" 
} 

यदि नौकरी की जरूरत है तो बैकऑफ लागू किया जाएगा। इसे इस तथ्य के साथ संयोजित करें कि आप इसे हर 10-20 सेकेंड में फिर से चलाने के लिए चाहते हैं, जिससे आप जिन परिणामों को अनुभव कर रहे हैं उन्हें मिल सकता है।

आपने नौकरी के लिए कोई बाधा निर्धारित नहीं की है, जो इसे चलाने पर भी प्रभावित होगी। जैसे

.setConstraints( // only run on an unmetered network Constraint.ON_UNMETERED_NETWORK, // only run when the device is charging Constraint.DEVICE_CHARGING )

इसके अलावा, मैं नहीं तुम क्या कर रहे हैं के लिए एक अनुसूचित नौकरी का प्रयोग करेंगे। Google API क्लाइंट को देखें जो fused location provider से आवधिक अपडेट प्रदान करता है।

आप यहाँ इतना

public class MainActivity extends ActionBarActivity implements 
     ConnectionCallbacks, OnConnectionFailedListener, LocationListener { 
    ... 
    @Override 
    public void onLocationChanged(Location location) { 
     mCurrentLocation = location; 
     mLastUpdateTime = DateFormat.getTimeInstance().format(new Date()); 
     updateUI(); 
    } 

    private void updateUI() { 
     mLatitudeTextView.setText(String.valueOf(mCurrentLocation.getLatitude())); 
     mLongitudeTextView.setText(String.valueOf(mCurrentLocation.getLongitude())); 
     mLastUpdateTimeTextView.setText(mLastUpdateTime); 
    } 
} 

चेकआउट पूर्ण दस्तावेज़ जैसे सेवा या गतिविधि पर एक कॉलबैक लागू कर सकते हैं, लेकिन मेरा मानना ​​है कि आप आप क्या हासिल करने की कोशिश कर रहे हैं के लिए समर्पित सेवाओं के साथ अधिक सुसंगत अनुभव होगा।

https://developer.android.com/training/location/receive-location-updates.html

+0

'ऑनस्टॉप जॉब 'के संबंध में, मैंने' सत्य 'और' झूठी 'दोनों के साथ प्रयास किया। कोई भाग्य नहीं। संग्रहीत स्थान प्रदाता के बारे में, हाँ, मैं वर्तमान स्थान निर्धारित करने के लिए इसका उपयोग कर रहा हूं। – kranthi117

+0

लेकिन आप इसका भी उपयोग कर सकते हैं शेड्यूल किए गए जॉब को प्रतिस्थापित करने के लिए स्थानान्तरण कॉलबैक। –

+0

मैंने आपके द्वारा लिंक किए गए दस्तावेज़ को आजमाया है, लेकिन इसके लिए डोज मोड और ऐपस्टैंडबी के साथ सक्रिय गतिविधि या सेवा की आवश्यकता होती है, यह सिरदर्द का बहुत अधिक है – kranthi117

1

ExecutionWindow अनुमानित समय निर्दिष्ट करता है। यह गारंटी नहीं है कि नौकरी दी गई विंडो पर चलेगी। यदि यह खिड़की से चूक जाता है तो नौकरी आदर्श परिस्थितियों में जल्द ही बाद में चलती है। नौकरी खत्म हो जाने के बाद आवर्ती नौकरियों के लिए अगली नौकरी समय की नौकरी से निष्पादन विंडो समय की गणना करेगी।

LINK

ExecutionWindow एक नौकरी ट्रिगर है कि योग्य हो जाता है एक बार वर्तमान बीता हुआ समय निर्धारित समय + {@code windowStart} मूल्य से अधिक का प्रतिनिधित्व करता है। शेड्यूलर बैकएंड को विंडो 12 मान को संकेत के रूप में उपयोग करने के लिए प्रोत्साहित किया जाता है कि नौकरी चलाना चाहिए, लेकिन यह एक लागू व्यवहार नहीं है।

4

इसके अलावा:

Trigger.executionWindow(windowStart, windowEnd) 

windowStart और सेकंड में windowEnd की उम्मीद है।आपकी आवश्यकता के अनुसार, आप खिड़की चाहते हैं कि 10 मिनट हो। तो आपको कुछ ऐसा उपयोग करना चाहिए:

Trigger.executionWindow(10*60, 20*60)