2010-12-05 11 views
9

एंड्रॉइड नोब यहाँ। मैं एक कार्यात्मक उदाहरण के स्रोत कोड को देखकर सबसे अच्छा सीखता हूं, लेकिन मैं अपने धागे में सॉकेट का उपयोग करने का एक सरल लेकिन पूर्ण उदाहरण नहीं ढूंढ पाया।धागे में सॉकेट से डेटा कैसे प्राप्त करें?

मेरे पास एक एंड्रॉइड सेवा है जिसे इंटरनेट के साथ संवाद करने की आवश्यकता है। मैं एक टीसीपी सॉकेट खोलना चाहता हूं जो इंटरनेट पर किसी सर्वर से कनेक्ट हो। सेवा को इंटरनेट पर डेटा भेजने की जरूरत है, और नेट से वापस आने वाले डेटा को सेवा में जाना होगा। चूंकि सेवा अन्य चीजें भी कर रही है, इसलिए सॉकेट कनेक्शन को अपने धागे में रहने की जरूरत है।

कोई विचार जहां मुझे सॉकेट से संचार के साथ थ्रेड में सॉकेट का उदाहरण मिल सकता है?

धन्यवाद

enter image description here

उत्तर

15

आप बस की जरूरत है एक एसिंक कार्य बनाएं जो पृष्ठभूमि में संचार करता है और फिर आवश्यकतानुसार यूआई थ्रेड को अपडेट करता है। यहाँ एक सॉकेट से जानकारी प्राप्त करने और बाइट की संख्या यह

public class InternetTask extends AsyncTask<Void, Integer, Void> { 

    private WeakReference<TextView> mUpdateView; 

    public LoginTask(TextView view) { 
     this.mUpdateView = new WeakReference<TextView>(view); 
    } 

    @Override 
    protected Void doInBackground() { 

     try { 
      Socket socket = new Socket("127.0.0.1", 80); 
        InputStream is = socket.getInputStream(); 

        byte[] buffer = new byte[25]; 
        int read = is.read(buffer); 
        while(read != -1){ 
         publishProgress(read); 
         read = is.read(buffer); 
        } 

        is.close(); 
        socket.close(); 



     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     if(mUpdateView.get() != null && values.length > 0){ 
        mUpdateView.get().setText(values[0].toString()); 
       } 
    } 

} 

रिसीवर के साथ एक पाठ दृश्य को अपडेट करने के लिए पृष्ठभूमि धागा यहाँ है और कैसे आप बंद

public class TestTab extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.someLayout); 

      TextView textView = (TextView)findViewById(R.id.someid); 
      InternetTask task = new InternetTask(textView); 
      task.execute(); 

    } 
} 
+0

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

+2

आप अपने एसिंक कार्य पर जो भी अन्य विधियां चाहते हैं उसे परिभाषित कर सकते हैं। बस जानते हैं कि doInBackground() विधि एक अलग थ्रेड पर निष्पादित केवल एक ही होगी। आप उस डेटा में भी पास कर सकते हैं जिसे आप कन्स्ट्रक्टर में या execute() विधि में भेजना चाहते हैं। –

+0

जब मैं doInBackground() में सॉकेट खोलता हूं, तब तक नया थ्रेड अवरुद्ध होने जा रहा है जब तक कि डेटा सॉकेट पर न आए। जब डेटा आता है, तो मैं इसे प्रकाशित करने के माध्यम से यूआई थ्रेड पर भेज सकता हूं। चूंकि उस कार्यकर्ता धागे पर सॉकेट बनाया गया था, इसलिए मैं UI थ्रेड से सॉकेट में डेटा कैसे भेजूं? मैं डेटा स्ट्रीम से निपट रहा हूं, इसलिए execute() कमांड के साथ पैरामीटर भेजना अच्छा है, लेकिन मुझे लगातार सॉकेट में डेटा भेजना होगा। –

8

यहाँ इस विषय, जहां दोनों सर्वर और ग्राहक भागों दिखा रहे हैं, सॉकेट संचार एक अलग थ्रेड पर जाने के साथ के बारे में एक लंबे ब्लॉग है।

http://thinkandroid.wordpress.com/2010/03/27/incorporating-socket-programming-into-your-applications/

एक बात है के बारे में पता होना करने के लिए है कि आप गुजर रहे हैं, तो int रों आप एक बाइट-आदेश समस्या में पड़ सकता है, तो, बस कुछ परीक्षण करते हैं और मैं आपको यह सुनिश्चित सर्वर में भेजता है सुझाव है यदि आपके पास एक से अधिक ओएस पर सर्वर हैं, तो एंड्रॉइड की आवश्यकता है।

एक आसान तरीका के लिए, Android पर बाइट क्रम आप इस का उपयोग कर सकते लगता है: http://developer.android.com/reference/java/nio/ByteOrder.html

इस लेख के अनुसार, बाइट क्रम अनुकूलन के लिए बदली जा सकती है: http://en.wikipedia.org/wiki/Dalvik_(software)

+0

कि धागा लात होगा स्पष्ट है यही कारण है कोड मैंने देखा है कि कैसे सॉकेट बनाने के लिए। हालांकि, सर्वर उदाहरण दिखाता है कि यूआई थ्रेड (हैंडलर के माध्यम से) को वापस डेटा कैसे भेजना है, उदाहरणों में से कोई भी नहीं दिखाता है कि UI थ्रेड से डेटा को सॉकेट थ्रेड में कैसे स्थानांतरित किया जाए। –

+0

आप यूआई थ्रेड पर वापस जाने के लिए View.post का उपयोग कर सकते हैं, लेकिन यह पृष्ठ आपको अन्य तरीकों से मदद कर सकता है: http://developer.android.com/guide/appendix/faq/commontasks.html#threading –

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