2010-01-25 16 views
8

सोच रहा था कि कोई भी एंड्रॉइड पर पृष्ठभूमि थ्रेडिंग पर मेरी मदद कर सकता है।एंड्रॉइड - पृष्ठभूमि थ्रेडिंग को सही तरीके से कैसे करें?

मेरे पास कोड का एक टुकड़ा है जो डिवाइस के माइक से रिकॉर्ड करता है और उसके बाद कान टुकड़े (1.5 पर) के माध्यम से रिकॉर्ड करता है।

मैं इसे थ्रेड में चलाने की कोशिश कर रहा हूं लेकिन पृष्ठभूमि थ्रेड के रूप में इसे चलाने में असफल रहा हूं।

वर्तमान में यह गतिविधि को चलाता है और लॉक करता है ताकि जो भी हो रहा है वह थ्रेड चल रहा है और यूआई लॉक हो गया है या लटक रहा है।

public class LoopProg extends Activity { 


boolean isRecording; //currently not used 

    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    AudioManager audio_service = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 

    audio_service.setSpeakerphoneOn(false); 
    audio_service.setMode(AudioManager.MODE_IN_CALL); 
    audio_service.setRouting(AudioManager.MODE_NORMAL, 
    AudioManager.ROUTE_EARPIECE, AudioManager.ROUTE_ALL); 

    Record record = new Record(); 
    record.run(); 

} 

    public class Record extends Thread 
    { 


      static final int bufferSize = 200000; 
      final short[] buffer = new short[bufferSize]; 
      short[] readBuffer = new short[bufferSize]; 

      public void run() { 
      isRecording = true; 
      android.os.Process.setThreadPriority 
      (android.os.Process.THREAD_PRIORITY_URGENT_AUDIO); 

      int buffersize = AudioRecord.getMinBufferSize(11025, 
      AudioFormat.CHANNEL_CONFIGURATION_MONO, 
      AudioFormat.ENCODING_PCM_16BIT); 

          AudioRecord arec = new AudioRecord(MediaRecorder.AudioSource.MIC, 
              11025, 
              AudioFormat.CHANNEL_CONFIGURATION_MONO, 
              AudioFormat.ENCODING_PCM_16BIT, 
              buffersize); 

          AudioTrack atrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, 
              11025, 
              AudioFormat.CHANNEL_CONFIGURATION_MONO, 
              AudioFormat.ENCODING_PCM_16BIT, 
              buffersize, 
              AudioTrack.MODE_STREAM); 

          setVolumeControlStream(AudioManager.STREAM_VOICE_CALL); 


          atrack.setPlaybackRate(11025); 

          byte[] buffer = new byte[buffersize]; 
          arec.startRecording(); 
          atrack.play(); 

          while(isRecording) { 
            arec.read(buffer, 0, buffersize); 
            atrack.write(buffer, 0, buffer.length); 
          } 

          arec.stop(); 
          atrack.stop(); 
          isRecording = false; 
       } 
     } 
} 

मैं सोच रहा था कि अगर किसी को भी मुझे कैसे एक पृष्ठभूमि धागा में इस चालू करने के लिए मार्गदर्शन कर सकते हैं:

यहाँ नवीनतम तरह से मैं यह करने की कोशिश की है? या फिर मुझे कुछ ट्यूटोरियल पर इंगित करें जो प्रासंगिक हो सकता है कि मैं याद कर सकता हूं?

अग्रिम

उत्तर

14

कोशिश बुला record.start() के बजाय .run धन्यवाद()।

Java API Docs से:

start() निष्पादन शुरू करने के लिए इस सूत्र का कारण बनता है; जावा वर्चुअल मशीन इस धागे की रन विधि को कॉल करती है।

आप AsyncTask में भी देखना चाहेंगे।

+1

धन्यवाद, इसे हल किया गया है। लेकिन क्या यह बैकग्राउंड या वर्कर थ्रेड के रूप में चलाने का सही तरीका है? –

+0

यह करने का एक तरीका है। आप या तो थ्रेड या रननेबल को लागू करके जावा तरीका कर सकते हैं, या आप इसे AsyncTask को कार्यान्वित करके एंड्रॉइड तरीका कर सकते हैं। मैं व्यक्तिगत रूप से अपने ऐप्स में लागू सभी पृष्ठभूमि धागे के लिए AsyncTask का उपयोग करता हूं। –

+0

धन्यवाद mBaird, AsyncTask –

3

आप Thread.run नहीं बुलाना चाहिए, फोन Thread.start

public void run()

इस सूत्र एक अलग Runnable रन वस्तु का उपयोग कर निर्माण किया गया था, तो उस Runnable वस्तु की दौड़ तरीका है बुलाया; अन्यथा, यह विधि और कुछ भी नहीं करती है।

+0

धन्यवाद निकोला, तो क्या मुझे इसे पृष्ठभूमि धागा बनाने के लिए चलाने योग्य लागू करना है? –

+0

कई मामलों में, हाँ आप धागे कन्स्ट्रक्टर में एक रननेबल ऑब्जेक्ट प्रदान करेंगे, या आप थ्रेड सबक्लास में रन() विधि को ओवरराइड/कार्यान्वित करेंगे। एक तीसरा विकल्प हैडलर थ्रेड बनाने और इसके हैंडलर() के माध्यम से संदेश पोस्ट करना है। – greg7gkb

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