As you may know android sdk greater than 3.2 has strict mode turn on by default. It means that if you do network connection on main (ui) thread android os will close your application.
I'm developing application with photon and start building it from realtime demo prj as an example. It works fine until disconnect method called from service onDestroy. Let see the code.
- Code: Select all
public void disconnect() {
if (null != timer) {
timer.cancel();
timer = null;
}
if (null != peer) {
peer.opLeave();
peer.disconnect();
}
peer = null;
players.clear();
localPlayer = null;
}
As i understood TaskTimer runs in separate thread. And all photon operations with networks operates inside this TimerTask ( peer.dispatchIncomingCommands() and peer.sendOutgoingCommands() ). Nevertheless i have an android.os.NetworkOnMainThreadException. Please find stackTrace below:
- Code: Select all
java.lang.RuntimeException: Unable to stop service com.slobodastudio.discussions.photon.PhotonService@2c2213d8: android.os.NetworkOnMainThreadException
at android.app.ActivityThread.handleStopService(ActivityThread.java:2405)
at android.app.ActivityThread.access$2000(ActivityThread.java:122)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1212)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4340)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method) Caused by: android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1086)
at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:163)
at libcore.io.IoBridge.sendto(IoBridge.java:463)
at java.net.PlainDatagramSocketImpl.send(PlainDatagramSocketImpl.java:182)
at java.net.DatagramSocket.send(DatagramSocket.java:287)
at de.exitgames.client.photon.UdpConnection.sendData(UdpConnection.java:37)
at de.exitgames.client.photon.EnetPeer.sendData(EnetPeer.java:582)
at de.exitgames.client.photon.EnetPeer.sendOutgoingCommands(EnetPeer.java:488)
at de.exitgames.client.photon.EnetPeer.disconnect(EnetPeer.java:115)
at de.exitgames.client.photon.PhotonPeer.disconnect(PhotonPeer.java:472)
at com.slobodastudio.discussions.photon.PhotonService.disconnect(PhotonService.java:108)
at com.slobodastudio.discussions.photon.PhotonService.onDestroy(PhotonService.java:132)
at android.app.ActivityThread.handleStopService(ActivityThread.java:2388)
... 10 more
My question is: what happens when timer stops? As we can see in disconnect funtion timer stops before peer.Leave and peer.disconnect. So how can we run peer.Leave and peer.disconnect commands if timer is already stopped? Who is sending outgoing command, could it be peer itself?
Thanks in advance,
Sergii

