Android 开发:多线程编程


功能与《Android 开发:Socket编程之udp发送》见 中一样,当按下键后,发送文本框中数据给PC。不同的是把发送数据的功能放在一个线程socket_send中。

环境:Windows 7 + Eclipse + SDK

代码:

主类test_socket.java

  1. package test.soket;  
  2.   
  3. //import com.test_button.R;   
  4.   
  5. import java.io.DataOutputStream;  
  6. import java.io.IOException;  
  7. import java.net.DatagramPacket;  
  8. import java.net.DatagramSocket;  
  9. import java.net.InetAddress;  
  10. import java.net.Socket;  
  11. import java.net.SocketException;  
  12. import java.net.UnknownHostException;  
  13.   
  14. import android.app.Activity;  
  15. import android.os.Bundle;  
  16. import android.view.View;  
  17. import android.widget.Button;  
  18. import android.widget.TextView;  
  19.   
  20. public class test_socket extends Activity {  
  21.     public static TextView show;  
  22.     public static Button press;  
  23.     public static boolean flag;  
  24.       
  25.     /** Called when the activity is first created. */  
  26.     @Override  
  27.     public void onCreate(Bundle savedInstanceState) {  
  28.         super.onCreate(savedInstanceState);  
  29.         setContentView(R.layout.main);  
  30.           
  31.         //开辟控件空间   
  32.         show = (TextView)findViewById(R.id.editText1);  
  33.         press = (Button)findViewById(R.id.button1);  
  34.         flag = false;  
  35.         soket_send thread = new soket_send();  
  36.         thread.init();  
  37.         thread.start();  
  38.              
  39.         press.setOnClickListener(new Button.OnClickListener()  
  40.         {  
  41.             @Override  
  42.             public void onClick(View v)  
  43.             {  
  44.                 flag = true;  
  45.             }  
  46.         });  
  47.     }  
  48. }  

线程类socke_sendt.java:

  1. package test.soket;  
  2.   
  3. import java.io.DataOutputStream;    
  4. import java.io.IOException;    
  5. import java.net.DatagramPacket;  
  6. import java.net.DatagramSocket;  
  7. import java.net.InetAddress;  
  8. import java.net.Socket;    
  9. import java.net.SocketException;  
  10. import java.net.UnknownHostException;    
  11. import java.util.LinkedList;    
  12.     
  13. import android.media.AudioFormat;    
  14. import android.media.AudioRecord;    
  15. import android.media.MediaRecorder;    
  16. import android.util.Log;     
  17.   
  18. public class soket_send extends Thread  
  19. {   
  20.     private static final int MAX_DATA_PACKET_LENGTH = 40;  
  21.     private byte[] buffer = new byte[MAX_DATA_PACKET_LENGTH];  
  22.     private DatagramPacket dataPacket;  
  23.     private DatagramSocket udpSocket;   
  24.       
  25.     public void init()    
  26.     {    
  27.         try  
  28.         {  
  29.             udpSocket = new DatagramSocket(5554);  
  30.         }  
  31.         catch (SocketException e)  
  32.         {  
  33.             // TODO Auto-generated catch block   
  34.             e.printStackTrace();  
  35.         }  
  36.         dataPacket = new DatagramPacket(buffer, MAX_DATA_PACKET_LENGTH);  
  37.         String str = "hello,jdh";  //这是要传输的数据   
  38.         byte out [] = str.getBytes();  //把传输内容分解成字节   
  39.         dataPacket.setData(out);  
  40.         dataPacket.setLength(out.length);  
  41.         dataPacket.setPort(5554);  
  42.           
  43.         try  
  44.         {  
  45.                   
  46.             InetAddress broadcastAddr = InetAddress.getByName("192.168.0.248");  
  47.             dataPacket.setAddress(broadcastAddr);  
  48.             udpSocket.send(dataPacket);  
  49.         }  
  50.         catch (IOException e)  
  51.         {  
  52.             // TODO Auto-generated catch block   
  53.             e.printStackTrace();  
  54.         }       
  55.     }    
  56.       
  57.     public void run()   
  58.     {    
  59.         while (true)  
  60.         {  
  61.             if (test_socket.flag)  
  62.             {  
  63.                 //获得输入框文本   
  64.                 CharSequence str =test_socket.show.getText();  
  65.                 byte out[] = str.toString().getBytes();  
  66.                 dataPacket.setData(out);  
  67.                 dataPacket.setLength(out.length);  
  68.                 try  
  69.                 {  
  70.                           
  71.                     InetAddress broadcastAddr = InetAddress.getByName("192.168.0.248");  
  72.                     dataPacket.setAddress(broadcastAddr);  
  73.                     udpSocket.send(dataPacket);  
  74.                 }  
  75.                 catch (IOException e)  
  76.                 {  
  77.                     // TODO Auto-generated catch block   
  78.                     e.printStackTrace();  
  79.                 }  
  80.                   
  81.                 test_socket.flag = false;  
  82.             }  
  83.         }  
  84.     }    
  85. }  

注意:程序中采用的线程间通信的方法是把需要共享的变量设置成public属性。

相关内容