2012-05-16 15 views
6

संदेश को सॉकेट पर भेजे जाने के बाद मैं एक टोस्ट प्रदर्शित करना चाहता हूं। इसके बाद "लॉग.d (" क्लाइंट एक्टिविटी "," सी: प्रेषित ");"हैंडलर/थ्रेड के अंदर टोस्ट कैसे प्रदर्शित करें?

क्या मुझे टोस्ट प्रदर्शित करने के लिए एक अलग धागा बनाने की आवश्यकता है?

public class ClientActivity extends Activity { 
private Handler handler = new Handler(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.client); 
    serverIp = (EditText) findViewById(R.id.EditText01); 
    message =(EditText) findViewById(R.id.EditText02); 
    connectPhones = (Button) findViewById(R.id.Button01); 

} 

    public void Click1(View v) { 
     if (!connected) { 
      serverIpAddress = serverIp.getText().toString(); 
      if (!serverIpAddress.equals("")) { 
       Thread cThread = new Thread(new ClientThread()); 
       cThread.start(); 
      } 
     } 
    } 


private class ClientThread implements Runnable { 

    public void run() { 
     try { 
      InetAddress serverAddr = InetAddress.getByName(serverIpAddress); 
      Log.d("ClientActivity", "C: Connecting..."); 
      Socket socket = new Socket(serverAddr, ServerActivity.SERVERPORT); 
      connected = true; 
      while (connected) { 
       try { 
        if(i>5) 
        { 


        } 
        else 
        { 
         Log.d("ClientActivity", "C: Sending command."); 
         PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket 
           .getOutputStream())), true); 
         // where you issue the commands 
         message1= message.getText().toString(); 
         out.println(message1); 
         i=i+1; 
         Log.d("ClientActivity", "C: Sent."); 
        }  
       } catch (Exception e) { 
        Log.e("ClientActivity", "S: Error", e); 
       } 
      } 
      socket.close(); 
      Log.d("ClientActivity", "C: Closed."); 
     } catch (Exception e) { 
      Log.e("ClientActivity", "C: Error", e); 
      connected = false; 
     } 
    } 
} 

}

उत्तर

17

इस लाइन

Log.d("ClientActivity", "C: Connecting..."); 
+0

घोषित करने और अपने मुख्य गतिविधि में हैंडलर ऑब्जेक्ट को प्रारंभ (धागा बाहर) करने के लिए यह अभी भी फेंकता है:

तो एक टोस्ट प्रदर्शित करने के लिए अपनी गतिविधि में ऐसा एक त्रुटि संदेश "विधि टोस्ट (संदर्भ, charSequence, int) प्रकार टोस्ट में विधि के लिए लागू नहीं है (नया रननेबल() {}, स्ट्रिंग, int)" – Shan

+0

त्रुटि क्या है? – 5hssba

+0

त्रुटि जोड़ा गया – Shan

1

एक वैश्विक हैंडलर पहले घोषित करने के बाद

runOnUiThread(new Runnable() { 
       public void run() { 

        Toast.makeText(ClientActivity.this,"asdf",Toast.LENGTH_LONG).show(); 
       } 
      }); 

शब्दों में कहें,

Handler handler=null; 

फिर अपने OnCreate() इस तरह के एक हैंडलर बनाएँ,

Handler handler=new Handler() 
{ 
    public void handleMessage(Message msg) 
{ 
    if(msg.what==0) 
{ 
    Toast.makeText(ClientActivity.this,"Your Toast Mesage Goes here",Toast.LENGTH_LONG).show(); 
} 

} 
}; 

और अब अपने Runnable वर्ग में के बाद "Log.d("ClientActivity", "C: Sent.");"

handler.sendEmptyMessage(0); 
समस्या आप का सामना कर रहे

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

3
Handler handler=new Handler(); 
handler.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     System.out.println("I'm in handler"); 
     Toast.makeText(YourActivity.this, "this is toast",Toast.LENGTH_SHORT); 
    } 
}, 1000);    
+1

यदि संदर्भ एक गतिविधि है (जैसा आपने अपनी एक्टिविटी के साथ निहित किया है। यह) आप केवल runOnUiThread() का उपयोग कर सकते हैं, है ना? –

+0

@ डेविडडोरिया आप सही हैं, क्योंकि हैंडलर केवल यूईई परिवर्तन करने के लिए उपयोग करते हैं और जब आप runOnUi थ्रेड विधि कार्यान्वयन देखते हैं, तो पहले यह जांचें कि वर्तमान थ्रेड ui धागा है या नहीं और यदि वर्तमान धागा ui धागा नहीं है तो यह कार्य को हैंडलर में दिया जाता है । – itechDroid

+0

बनाए गए टोस्ट पर .show() को कॉल करना याद रखें। –

2

आप धागे के अंदर से टोस्ट नहीं बना सकते हैं। चूंकि इस नए धागे को getApplicationContext() तक पहुंच नहीं है जिसे आप पास करते हैं। आपको किसी भी तरह यूआई थ्रेड (यानी मुख्य धागा) के साथ संचार स्थापित करना होगा।
तो जब भी आप कुछ करना चाहते हैं तो इसे handler.Post(Runnable) विधि में करें। हैंडलर यूआई थ्रेड और आपके द्वारा चलाए जा रहे अलग थ्रेड के बीच middle man है। सभी यूआई ऑपरेशंस को handler.Post(Runnable) की run() विधि में किया जाना होगा।

private class ClientThread implements Runnable { 

    public void run() { 
     try { 
      InetAddress serverAddr = InetAddress.getByName(serverIpAddress); 
      ..... 
      ..... 
       message1= message.getText().toString(); 
         out.println(message1); 
         i=i+1; 
         Log.d("ClientActivity", "C: Sent."); 
         handler.post(new Runnable(){ 
          public void run() 
          { 
          Toast.make(....); 
          } 
         }); 

मत भूलना

handler=new Handler(); 
संबंधित मुद्दे