2012-05-31 18 views
5

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

अब यहां है जहां एंड्रॉइड के साथ मेरा अनुभवहीनता अपने सिर को पीछे छोड़ना शुरू कर देता है। मैं एक अनंत लूप के रूप में पढ़ने और लिखने के संचालन का संचालन कर रहा हूं। सेवा नीचे दी गई है:

public class AudioService extends Service { 

private final int MIC = AudioSource.MIC; 
private final int SAMPLE = 44100; 
private final int CHANNELI = AudioFormat.CHANNEL_IN_MONO; 
private final int CHANNELO = AudioFormat.CHANNEL_OUT_MONO; 
private final int FORMAT = AudioFormat.ENCODING_PCM_16BIT; 
private final int BUFFERSIZE = AudioRecord.getMinBufferSize(SAMPLE, 
     CHANNELI, FORMAT); 
private final int STREAM = AudioManager.STREAM_MUSIC; 
private final int MODE = AudioTrack.MODE_STREAM; 
private boolean play = true; 

AudioRecord recorder = null; 
AudioTrack track = null; 

short[] buffer = null; 

public void OnCreate() { 

} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    recorder = new AudioRecord(MIC, SAMPLE, CHANNELI, FORMAT, BUFFERSIZE); 
    track = new AudioTrack(STREAM, SAMPLE, CHANNELO, FORMAT, BUFFERSIZE, 
      MODE); 
    buffer = new short[BUFFERSIZE]; 
    recorder.startRecording(); 
    track.play(); 

    while (play) { 
     recorder.read(buffer, 0, buffer.length); 
     track.write(buffer, 0, buffer.length); 
    } 
    return START_STICKY; 
} 

इस सेवा को तब कहा जाता है जब गतिविधि में "रिकॉर्ड" बटन क्लिक किया जाता है। मैं रिकॉर्ड पर क्लिक करने में सक्षम होना चाहता हूं और इस लूप को रोकने के लिए रद्द करने का विकल्प प्राप्त करना चाहता हूं। नीचे दिए गए श्रोता यह लागू करता है:

private OnClickListener Recording = new OnClickListener() { 
    public void onClick(View v) { 

     serviceIntent = new Intent(getApplicationContext(), 
       AudioService.class); 
     serviceIntent.putExtra("extraData", "somedata"); 
     startService(serviceIntent); 

     record.setEnabled(false); 
     cancel.setEnabled(true); 
     cancel.requestFocus(); 

}; 

और अब समस्या स्पष्ट हो जाती है। जब यह startService (serviceIntent) तक पहुंचता है और शेष राशि में बस लटकता है तो एप्लिकेशन निष्पादन को पूरा करने में असमर्थ है।

तो मेरा सहारा क्या है? मैं अनंत लूप के अंदर से सेवा को नियंत्रित करने के किसी तरीके के बारे में सोच रहा था लेकिन एंड्रॉइड के साथ मेरा अनुभवहीनता मुझे सोचता है कि यह कैसे करना है। लूप के अंदर एक नया बटन तुरंत चालू करने के द्वारा तोड़ने के कुछ तरीके को शामिल करना; तो शुरुआत के दौरान मैं लूप से बाहर निकलने और "पागलपन खत्म" करने में सक्षम हो जाएगा।

किसी भी मदद की सराहना की जाएगी। मैं यह भी महसूस कर रहा हूं कि यह सेवा UI से अलग थ्रेड पर शुरू की जानी चाहिए ताकि "ऐप प्रतिसाद नहीं दे रहा है ..." समस्या से बचने के लिए, लेकिन यह एक और विषय है। अभी मेरा मुख्य लक्ष्य लूप से तोड़ रहा है और मैं इस काम को कैसे करें इस पर किसी भी मदद या दिशा की सराहना करता हूं।

उत्तर

4

सेवा है नीचे

समस्या # 1: आप अपने लूप से बाहर तोड़ने का कोई रास्ता नहीं है।

समस्या # 2: आपका लूप मुख्य अनुप्रयोग धागे पर चल रहा है।

यह बुरा है।

तो मेरा सहारा क्या है?

आप एक पृष्ठभूमि सूत्र में अपने अनंत लूप में कहें, कुछ का उपयोग कर (जैसे, AtomicBoolean) कि धागा जब जरूरत को रोकने के लिए बताने के लिए (जैसे, onDestroy())।

मैं यह भी महसूस कर रहा हूं कि यह सेवा UI से अलग थ्रेड पर शुरू की जानी चाहिए ताकि "ऐप प्रतिसाद नहीं दे रहा है ..." समस्या से बचने के लिए, लेकिन यह एक और विषय है।

नहीं, यह वही विषय है।

शायद पाश

सेवाएं एक यूआई की जरूरत नहीं है के अंदर एक नया बटन instantiating द्वारा तोड़ने के लिए किसी तरह भड़काने।

चूंकि आपके पास उस गतिविधि में "रिकॉर्ड" बटन है जो startService() पर कॉल ट्रिगर करता है, तो शायद उस गतिविधि में "स्टॉप" बटन होना चाहिए जो stopService() पर कॉल ट्रिगर करता है।

एक बार जब आप निर्धारित कहाँ और कैसे stopService() कॉल करने के लिए, तो तुम सब करने की जरूरत है अपनी सेवा के onDestroy() मिल अपनी पृष्ठभूमि धागा, चलना बंद कर के रूप में onDestroy()stopService() करने के लिए कॉल से शुरू हो रहा हो जाएगा पैदा करने के लिए है।

+0

बिल्कुल सही! मैं लूप को पृष्ठभूमि थ्रेड पर ले जाने पर काम करूंगा। एक रद्द बटन है जिसका लक्ष्य यह सब रोकने के लिए था, लेकिन रिकॉर्ड रिकॉर्ड करने के बाद मैं लटका हुआ था। धन्यवाद! – user1429581

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