multithreading - Android background service to connect TCP server and handle message -
according google example, write android client connection protocol based on tcp socket server can send , receive information , works good. want become background service these transactions, after left application can notify me message in time, think couple of days, without success, can give me help? grateful!
mainactivity
public class mainactivity extends activity implements handler.callback, chatfragment.messagetarget { public static final string tag = "rolingbaby"; public static final int message_read = 0x400 + 1; public static final int message_send = 0x400 + 2; public static final string server_url = "192.168.191.2"; public static final int server_port = 7838; private handler handler = new handler(this); private chatfragment chatfragment; public handler gethandler() { return handler; } public void sethandler(handler handler) { this.handler = handler; } @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); try { inetaddress address = inetaddress.getbyname(server_url); log.d(tag, "connected success!"); new mytask1(((chatfragment.messagetarget) this).gethandler(), address).execute(); } catch (unknownhostexception e) { e.printstacktrace(); } chatfragment = new chatfragment(); getfragmentmanager().begintransaction() .add(r.id.container, chatfragment, "trans") .commit(); } @override public boolean handlemessage(message msg) { switch (msg.what) { case message_read: byte[] readbuf = (byte[]) msg.obj; // construct string valid bytes in buffer string readmessage = new string(readbuf, 0, msg.arg1); log.d(tag, readmessage); (chatfragment).pushmessage("rec: " + readmessage); break; case message_send: object obj = msg.obj; (chatfragment).setchatmanager((chatmanager) obj); } return true; } @override protected void onpause() { super.onpause(); finish(); } } pivotal code in chatfragment
public interface messagetarget { public handler gethandler(); } public void setchatmanager(chatmanager obj) { chatmanager = obj; } public void pushmessage(string readmessage) { adapter.add(readmessage); adapter.notifydatasetchanged(); } mytask
public class mytask extends asynctask<void, void, void>{ private static final string tag = "clientsockethandler"; private handler handler; private chatmanager chat; private inetaddress maddress; private static final int timeout = 5000; public mytask(handler handler, inetaddress serveraddress) { this.handler = handler; this.maddress = serveraddress; } @override protected void onpreexecute() { super.onpreexecute(); } @override protected void doinbackground(void... params) { socket socket = new socket(); try { socket.bind(null); socket.connect(new inetsocketaddress(maddress.gethostaddress(), mainactivity.server_port), timeout); log.d(tag, "launching i/o handler"); chat = new chatmanager(socket, handler); new thread(chat).start(); } catch (ioexception e) { e.printstacktrace(); try { socket.close(); } catch (ioexception e1) { e1.printstacktrace(); } } return null; } public chatmanager getchat() { return chat; } } chatmanager
public class chatmanager implements runnable { private socket socket = null; private handler handler; public chatmanager(socket socket, handler handler) { this.socket = socket; this.handler = handler; } private inputstream istream; private outputstream ostream; private static final string tag = "chathandler"; public static string readmessage; @override public void run() { try { istream = socket.getinputstream(); ostream = socket.getoutputstream(); byte[] buffer = new byte[1024]; int bytes; handler.obtainmessage(mainactivity.message_send, this) .sendtotarget(); while (true) { try { // read inputstream bytes = istream.read(buffer); if (bytes == -1) { break; }else{ readmessage = new string(buffer, "utf-8"); } // send obtained bytes ui activity log.d(tag, "rec:" + string.valueof(buffer)); handler.obtainmessage(mainactivity.message_read, bytes, -1, buffer).sendtotarget(); } catch (ioexception e) { log.e(tag, "disconnected", e); } } } catch (ioexception e) { e.printstacktrace(); } { try { socket.close(); } catch (ioexception e) { e.printstacktrace(); } } } public void write(byte[] buffer) { try { ostream.write(buffer); } catch (ioexception e) { log.e(tag, "exception during write", e); } } }
Comments
Post a Comment