2012-06-05 17 views
6

मेरे पास एक पृष्ठभूमि सेवा है जो दिन में एक बार लेनदेन के भीतर कुछ भारी भारोत्तोलन करती है। यदि उपयोगकर्ता इस समय ऐप शुरू करने के लिए होता है, तो मैं चाहता हूं कि वह इसे समाप्त होने तक तंग बैठे (लगभग 10 सेकंड या उससे भी अधिक)। सभी गतिविधियों में ऐसा करने का सबसे अच्छा तरीका क्या है? जांचें कि सेवा प्रत्येक गतिविधि के "ऑनस्यूम" फ़ंक्शन में चल रही है या नहीं? और यह कब होता है जब यह किया जाता है? स्थानीय प्रसारण मैं अनुमान लगा रहा हूं ...डाटाबेस कुछ भारी पृष्ठभूमि काम करते समय फ्रीज और एप्लिकेशन का सबसे अच्छा तरीका है?

कोई भी सर्वोत्तम अभ्यास करता है?

अद्यतन: मेरी सेवा पूरी होने तक मैंने "ऑनस्यूम" को रोकने में कामयाब रहा है। समस्या यह है कि उपयोगकर्ता तब तक एक खाली स्क्रीन देखता है। जब मैंने रेज़्यूम को रोका है, तो मैंने प्रगतिशीलता और नियमित संवाद की कोशिश की है। लेकिन वे सभी केवल तभी प्रदर्शित होते हैं जब रिज्यूमे रिटर्न मिलता है और यह उद्देश्य को हरा देता है। दूसरे शब्दों में, प्रगति संवाद नहीं "शो" के तुरंत बाद "शो()" कहा जाता है :(

उत्तर

1

स्थानीय प्रसारण अच्छा है।

क्या आपकी गतिविधियां व्यस्त हैं या नहीं, और गतिविधि को समाप्त करने से पहले उपयोगकर्ता को उचित संदेश प्रदर्शित करें।

सेवा पूरी होने के बाद, यह एक इरादा भेजता है कि यह समाप्त हो गया है।

+0

हाँ, मैंने सेवा में व्यस्त होने पर उपयोगकर्ता को ऐप शुरू करने पर बस स्क्रीन से बाहर निकलने का निर्णय लिया है! दुर्भाग्यवश, जब मैंने फिनिश(): | कहा है तो एक "टोस्ट" संदेश काम नहीं कर रहा है –

2

मैं एक 'मैं व्यस्त प्रसंस्करण हूँ' DB में झंडा।

होता करता है

और ऐप को स्टार्ट अप पर जांच करनी चाहिए, और उसके बाद ऐप को एक अच्छे तरीके से लॉक करना चाहिए, और उसके बाद फ्लैग की स्थिति देखने के लिए हर एक्स सेकंड कहें। यह सामान्य प्रसंस्करण के दौरान ऐसा कर सकता है ताकि प्रत्येक कार्रवाई स्थानीय रूप से इस ध्वज को जांच सके और शुरू करने से पहले सर्वर पर

लॉकिंग का एक आसान तरीका लगता है। इसलिए आपको खाते में विवाद करना होगा (एकाधिक उपयोगकर्ता सेटिंग और अनसेटिन जी) संभवतः एक semaphore प्रकार arangement का उपयोग कर।

+0

अभी तक सेमफोर का अध्ययन नहीं किया है, लेकिन मैंने आपके सुझाव की कोशिश की। मैंने "ऑनस्यूम" विधि में थोड़ी देर में "थ्रेड स्लीप" किया था, लेकिन स्क्रीन खाली हो गई और कभी नहीं जाग गया :) –

+0

आपको नींद के थ्रेड को जागने के तरीके को पढ़ने की जरूरत है –

+0

इसे काम करने के लिए मिला :) । एकमात्र मुद्दा यह है कि "ऑनस्यूम" फ़ंक्शन सो रहा है, लेकिन मुझे टोस्ट या एक संवाद संदेश या प्रगति संवाद दिखाने के लिए मिल सकता है - वे लोग बाद में जीवित आते हैं ... अच्छा, फिर से शुरू होता है! –

0

भारी डेटाबेस काम करने के लिए आपकी सेवा में AsyncTask का उपयोग करें।

और साझा प्राथमिकता ध्वज को बचाने के लिए काम करने वाली अन्य गतिविधियों को सूचित करने के लिए ध्वज को बचाने के लिए उपयोग करें। जब ध्वज सत्य होता है तो प्रगति पर काम होता है और जब झंडा झूठा होता है तो इसका मतलब है कि कार्य किया गया है।

कुछ इस तरह कार्य करें:

private class DatabaseWork extends AsyncTask<String, Integer, Long> { 


protected void onPreExecute() 
    { 
     //Set SharedPref flag = trueto notify other activities that work has been started. 
    } 
protected Long doInBackground(URL... urls) { 

     //Your database work 
    return false; 
} 

protected void onProgressUpdate(Integer... progress) { 
    //if you want to show progress to user 
} 

protected void onPostExecute(Long result) { 
    //after complete your work set SharedPref flag = false to notify other activities that work has been finished. 
} 

}

अब आप जाँच कर सकते हैं प्रत्येक गतिविधियों पर SharedPref झंडा मूल्य onCreate या onResume घटना। यदि आपको सत्य मिला तो आप उपयोगकर्ता को प्रतीक्षा करने के लिए एक प्रगति संवाद दिखा सकते हैं।

+0

मैं एक सेवा में कार्य चला रहा हूं, इसलिए "ऑनस्यूम" में, मैं यह देखने के लिए जांचता हूं कि यह चल रहा है और यदि नहीं, तो इसे थोड़ी देर के लिए कुछ सेकंड के लिए सोएं। केवल एक चीज है, जबकि यूआई थ्रेड सो रहा है, मैं एक संवाद या टोस्ट संदेश प्रदर्शित करने में सक्षम नहीं हूं। ऐसा लगता है कि ऑनस्यूम ने पूरा किया है इस बिंदु को किस प्रकार याद आती है! –

+0

@ भागवाड़ - 'रेस्यूम' में सोएं मत। इसके बजाए, काम शुरू होने के संबंध में, दो राज्यों में से एक में काम करने के लिए, अपने जीवन चक्र विधियों ('ऑनक्रेट', 'ऑनर्यूम',' ऑन पॉज़ 'इत्यादि) में काम करने के लिए डिज़ाइन करें। –

+0

बात यह है कि, यदि मेरा डेटाबेस लॉक है, तो super.onResume एक त्रुटि फेंकता है। चूंकि मुझे इसे किसी भी तरह से कॉल करना है, मैं तब तक खराब हूं जब तक कि मेरा डेटाबेस लॉक न हो जाए तब तक मैं निष्पादन में देरी कर सकता हूं। –

0

मुझे मिला सबसे अच्छा तरीका "लोडिंग गतिविधि" बनाना था जो हमेशा पहले लोड होता है और ऐसा करने के लिए सुरक्षित होने पर उपयोगकर्ता को मुख्य स्क्रीन पर भेज दिया जाता है।