ppt

advertisement
Android Introduction
Hello Threads
@2010 Mihail L. Sichitiu
1
Goal

Create an application
that uses a
background thread
as a UDP server to
receive messages
from the UDP client
@2010 Mihail L. Sichitiu
152.4.244.125
Text sent from UDPClient
2
Layout
TextView that changes
from “Starting Server” to
“Server Started” (optional)
152.4.244.125
TextView that shows the
IP address of the server
(needed for UDPClient)
Text sent from UDPClient
Clear Button – clears the
Last Message (and shows
that interface is still
responsive)
TextView that shows the
text sent from UDPClient
@2010 Mihail L. Sichitiu
3
Application Structure
ServerThread
Main Activity
OnCreate( )
Constructor
Create the thread
Start the thread
UDPClient
Read line from input
Open the Socket
If successful – “Server Started”
Find and display the IP Address
run( )
Message
Handler
while (socketStillOpen){
receive packet
display Message
send reply
}
OnDestroy( )
Send line to Server
Receive line from Server
close the socket
OnClickListener( )
Display line
Clear the Last Message
HelloThreads
@2010 Mihail L. Sichitiu
UDPClient
4
Main Activity (HelloThreads)

ClassMembers
TextView
isRunning,myIPAddressField,lastMessage;
Button
clear;
ServerThread myThread;
Handler

OnCreate( )





Get handles (findViewById) to all GUI elements
Create ServerThread: myThread=new
ServerThread(getApplicationContext(),mHandler)
Start the Thread: myThread.start();
Register the OnClickListener for the Clear Button
OnDestroy( )


Handler
Definition on
Next page
myThread.closeSocket();
OnClickListener( )

Clear the Last Message
@2010 Mihail L. Sichitiu
5
The Handler Definition



private final Handler mHandler = new Handler() {
 public void handleMessage(Message msg) {

switch (msg.what) {

case PACKET_CAME:

String incomingMessage = (String) msg.obj;

lastMessage.setText(incomingMessage);

break;

case IS_RUNNING:

String socketStatus = (String) msg.obj;

isRunning.setText(socketStatus);

break;

case IP_ADDRESS:

InetAddress myIPAddress = (InetAddress) msg.obj;

myIPAddressField.setText("Server IP
Address:"+myIPAddress.toString());

break;

}
}
};
@2010 Mihail L. Sichitiu
6
ServerThread


public class ServerThread extends Thread
Class Members




public ServerThread(Context currentContext,Handler handler){







mContext = currentContext;
mHandler = handler;
Open the socket; if successful
mHandler.obtainMessage(HelloThreads2.IS_RUNNING, "Server
On Next
Started").sendToTarget();
Page
InetAddress myIP = getMyWiFiIPAddress();
mHandler.obtainMessage(HelloThreads2.IP_ADDRESS, myIP).sendToTarget();
public void closeSocket()


Handler mHandler; // link to the Message Handler
Context mContext; // link to application context
DatagramSocket serverSocket; // the UDP socket we’ll receive at
serverSocket.close();
public void run()
On Next
Next Page
@2010 Mihail L. Sichitiu
Allows the socket to
be closed (call from
OnDestroy())
7
Getting the IP Address: getMyWiFiIPAddress( );
WifiManager mWifi = (WifiManager)
(mContext.getSystemService(Context.WIFI_SERVICE));
WifiInfo info = mWifi.getConnectionInfo();
DhcpInfo dhcp = mWifi.getDhcpInfo();
int myIntegerIPAddress = dhcp.ipAddress;
byte[] quads = new byte[4];
for (int k = 0; k < 4; k++)
quads[k] = (byte) ((myIntegerIPAddress>> k * 8) & 0xFF);
try{
InetAddress myIPAddress = InetAddress.getByAddress(quads);
return myIPAddress;
}catch(Exception e){
if(D) Log.e(TAG,"Cannot Get My Own IP Address");
return null
}
@2010 Mihail L. Sichitiu
8
ServerThread.run( )


boolean socketOK=true; // True as long as we don't get
socket errors
Handles multiple requests
as long as the socket is OK
while(socketOK) {





DatagramPacket receivePacket = new DatagramPacket(receiveData,
receiveData.length);
try{
Blocks
 serverSocket.receive(receivePacket);
 /*** ..... Same as the UDP server ........ ****/
 mHandler.obtainMessage(HelloThreads2.PACKET_CAME,sentence).
sendToTarget();
} catch (Exception e){
To the
 socketOK = false;
Message
Handler in the
}// try
main Thread
}// while(socketOK)
@2010 Mihail L. Sichitiu
9
Android Manifest

To be able to use the Internet (open sockets) and to read our
own IP address (from the WiFi Manager):


<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"
/>
@2010 Mihail L. Sichitiu
10
Download