-1

i have an android program who which can get touch location on a textview but when i send the coord coordination by socket, the program sends it once and directly crashes.

Do you have any idea ?

The code in the java file .

    final TextView tvCamera = (TextView)findViewById(R.id.textViewCamera);
    // this is the view on which you will listen for touch events
    final View touchView = findViewById(R.id.touchViewCamera);
                touchView.setOnTouchListener(new View.OnTouchListener() {
                    @Override
                    public boolean onTouch(View v, MotionEvent event) {
                        int x = (int) (event.getX()-150);
                        int y = (int) (event.getY()-150)*(-1);
                        if (x<-150)
                            x=-150;
                        else if (x>150)
                            x=150;                          
                        if (y<-150)
                            y=-150;
                        else if (y>150)
                            y=150;  
                        tvCamera.setText("Coordonnées Camera : (X:Y) "+String.valueOf(x) + " : " + String.valueOf(y));
                        try {                               
                            ClientSocket.requete("SC 05 "+String.valueOf( x ));
                            Log.d("Message", "Message caméra envoyé");
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            Log.d("Message", "Message caméra echec");
                            e.printStackTrace();
                        }                       
                            return true;                                
                    }                       
                });

The code in the request file .java

  public class ClientSocket {
   private static Socket socket;
   private static BufferedReader in;
   private static PrintWriter out;

   public ClientSocket(String nomSrv, int port) throws Exception {
    socket = new Socket(nomSrv, port);
    out = new PrintWriter(socket.getOutputStream(), true);
    in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
}



public static String requete(String msg) throws IOException {
    out.println(msg);
    String line = in.readLine();
    return line;
}

public static void fermeture() throws IOException{
    in.close();
    out.close();
    socket.close();
}

}

When i touch the screen and send "ClientSocket.requete("SC 05 "+String.valueOf( x ));" i am having problem on : String line = in.readLine();

Report tag :

06-12 08:25:13.214: D/dalvikvm(785): GC_FOR_ALLOC freed 65K, 8% free 2479K/2672K, paused 88ms, total 91ms 06-12 08:25:13.283: I/dalvikvm-heap(785): Grow heap (frag case) to 9.869MB for 7680016-byte allocation 06-12 08:25:13.333: D/dalvikvm(785): GC_FOR_ALLOC freed <1K, 2% free 9978K/10176K, paused 47ms, total 47ms 06-12 08:25:13.383: D/dalvikvm(785): GC_CONCURRENT freed <1K, 2% free 9978K/10176K, paused 5ms+5ms, total 57ms 06-12 08:25:14.034: D/libEGL(785): loaded /system/lib/egl/libEGL_emulation.so 06-12 08:25:14.044: D/(785): HostConnection::get() New Host Connection established 0x2a1835e8, tid 785 06-12 08:25:14.074: D/libEGL(785): loaded /system/lib/egl/libGLESv1_CM_emulation.so 06-12 08:25:14.084: D/libEGL(785): loaded /system/lib/egl/libGLESv2_emulation.so 06-12 08:25:14.236: W/EGL_emulation(785): eglSurfaceAttrib not implemented 06-12 08:25:14.255: D/OpenGLRenderer(785): Enabling debug mode 0 06-12 08:25:16.134: I/System.out(785): Vous ete connecter car reception du message : S0 06-12 08:25:16.134: I/System.out(785): Connexion établie avec le serveur ! 06-12 08:25:16.134: I/System.out(785): S0 06-12 08:25:17.143: E/InputEventReceiver(785): Exception dispatching input event. 06-12 08:25:17.143: E/MessageQueue-JNI(785): Exception in MessageQueue callback: handleReceiveCallback 06-12 08:25:17.244: E/MessageQueue-JNI(785): android.os.NetworkOnMainThreadException 06-12 08:25:17.244: E/MessageQueue-JNI(785): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:163) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at libcore.io.IoBridge.recvfrom(IoBridge.java:513) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at java.net.PlainSocketImpl.read(PlainSocketImpl.java:488) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at java.io.InputStreamReader.read(InputStreamReader.java:244) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at java.io.BufferedReader.fillBuf(BufferedReader.java:130) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at java.io.BufferedReader.readLine(BufferedReader.java:354) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at sockets.ClientSocket.requete(ClientSocket.java:30) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at ihm.IHM_Smartphone$1.onTouch(IHM_Smartphone.java:73) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at android.view.View.dispatchTouchEvent(View.java:7241) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1875) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1875) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1875) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1875) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1875) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1953) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1405) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at android.app.Activity.dispatchTouchEvent(Activity.java:2410) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1901) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at android.view.View.dispatchPointerEvent(View.java:7426) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3220) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3165) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4292) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4271) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4363) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:179) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at android.os.MessageQueue.nativePollOnce(Native Method) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at android.os.MessageQueue.next(MessageQueue.java:125) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at android.os.Looper.loop(Looper.java:124) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at android.app.ActivityThread.main(ActivityThread.java:5041) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at java.lang.reflect.Method.invokeNative(Native Method) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at java.lang.reflect.Method.invoke(Method.java:511) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 06-12 08:25:17.244: E/MessageQueue-JNI(785): at dalvik.system.NativeStart.main(Native Method) 06-12 08:25:17.264: D/AndroidRuntime(785): Shutting down VM 06-12 08:25:17.264: W/dalvikvm(785): threadid=1: thread exiting with uncaught exception (group=0x40a71930) 06-12 08:25:17.284: E/AndroidRuntime(785): FATAL EXCEPTION: main 06-12 08:25:17.284: E/AndroidRuntime(785): android.os.NetworkOnMainThreadException 06-12 08:25:17.284: E/AndroidRuntime(785): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117) 06-12 08:25:17.284: E/AndroidRuntime(785): at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:163) 06-12 08:25:17.284: E/AndroidRuntime(785): at libcore.io.IoBridge.recvfrom(IoBridge.java:513) 06-12 08:25:17.284: E/AndroidRuntime(785): at java.net.PlainSocketImpl.read(PlainSocketImpl.java:488) 06-12 08:25:17.284: E/AndroidRuntime(785): at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46) 06-12 08:25:17.284: E/AndroidRuntime(785): at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240) 06-12 08:25:17.284: E/AndroidRuntime(785): at java.io.InputStreamReader.read(InputStreamReader.java:244) 06-12 08:25:17.284: E/AndroidRuntime(785): at java.io.BufferedReader.fillBuf(BufferedReader.java:130) 06-12 08:25:17.284: E/AndroidRuntime(785): at java.io.BufferedReader.readLine(BufferedReader.java:354) 06-12 08:25:17.284: E/AndroidRuntime(785): at sockets.ClientSocket.requete(ClientSocket.java:30) 06-12 08:25:17.284: E/AndroidRuntime(785): at ihm.IHM_Smartphone$1.onTouch(IHM_Smartphone.java:73) 06-12 08:25:17.284: E/AndroidRuntime(785): at android.view.View.dispatchTouchEvent(View.java:7241) 06-12 08:25:17.284: E/AndroidRuntime(785): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 06-12 08:25:17.284: E/AndroidRuntime(785): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1875) 06-12 08:25:17.284: E/AndroidRuntime(785): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 06-12 08:25:17.284: E/AndroidRuntime(785): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1875) 06-12 08:25:17.284: E/AndroidRuntime(785): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 06-12 08:25:17.284: E/AndroidRuntime(785): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1875) 06-12 08:25:17.284: E/AndroidRuntime(785): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 06-12 08:25:17.284: E/AndroidRuntime(785): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1875) 06-12 08:25:17.284: E/AndroidRuntime(785): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 06-12 08:25:17.284: E/AndroidRuntime(785): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1875) 06-12 08:25:17.284: E/AndroidRuntime(785): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1953) 06-12 08:25:17.284: E/AndroidRuntime(785): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1405) 06-12 08:25:17.284: E/AndroidRuntime(785): at android.app.Activity.dispatchTouchEvent(Activity.java:2410) 06-12 08:25:17.284: E/AndroidRuntime(785): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1901) 06-12 08:25:17.284: E/AndroidRuntime(785): at android.view.View.dispatchPointerEvent(View.java:7426) 06-12 08:25:17.284: E/AndroidRuntime(785): at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3220) 06-12 08:25:17.284: E/AndroidRuntime(785): at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3165) 06-12 08:25:17.284: E/AndroidRuntime(785): at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4292) 06-12 08:25:17.284: E/AndroidRuntime(785): at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4271) 06-12 08:25:17.284: E/AndroidRuntime(785): at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4363) 06-12 08:25:17.284: E/AndroidRuntime(785): at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:179) 06-12 08:25:17.284: E/AndroidRuntime(785): at android.os.MessageQueue.nativePollOnce(Native Method) 06-12 08:25:17.284: E/AndroidRuntime(785): at android.os.MessageQueue.next(MessageQueue.java:125) 06-12 08:25:17.284: E/AndroidRuntime(785): at android.os.Looper.loop(Looper.java:124) 06-12 08:25:17.284: E/AndroidRuntime(785): at android.app.ActivityThread.main(ActivityThread.java:5041) 06-12 08:25:17.284: E/AndroidRuntime(785): at java.lang.reflect.Method.invokeNative(Native Method) 06-12 08:25:17.284: E/AndroidRuntime(785): at java.lang.reflect.Method.invoke(Method.java:511) 06-12 08:25:17.284: E/AndroidRuntime(785): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 06-12 08:25:17.284: E/AndroidRuntime(785): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 06-12 08:25:17.284: E/AndroidRuntime(785): at dalvik.system.NativeStart.main(Native Method)

whith the Jop's edit i have :

public class ClientSocket extends Thread {
private static Socket socket;
private static BufferedReader in;
private static PrintWriter out;
private ReplyHandler cb;

public ClientSocket(String nomSrv, int port) throws Exception {
    socket = new Socket(nomSrv, port);
    out = new PrintWriter(socket.getOutputStream(), true);
    in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
}



public static String requete(String msg) throws IOException {
    out.println(msg);
    String line = in.readLine();
    return line;
}

public static void fermeture() throws IOException{
    in.close();
    out.close();
    socket.close();
}

public static interface ReplyHandler {
    public void handleReply(String line);
     // more methods, if you need them... (e.g., handleException)

};

public  String requete(String msg, ReplyHandler cb) throws IOException {
    this.cb = cb;
    out.println(msg);
    return msg;
}

public void run() {
    while(true) {
        String line = null;
        try {
            line = in.readLine();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        cb.handleReply(line);
    }
}
/*private Handler handler = new Handler() {
    public void handleMessage(android.os.Message msg) {
        if(msg.what == 0) {
            monBouton.setText("C'est bon");
        }
    };
};*/

}

1 Answers1

0

You cannot use networking primitives on the main event dispatch thread, as this might block the UI. See the documentation and this other question.

In short, you should use a background thread to read from the socket and execute a callback when the request is finished. Assuming that you change ClientSocket as sketeched below:

public class ClientSocket extends Thread {

    public static interface ReplyHandler {
        public void handleReply(String line);
         // more methods, if you need them... (e.g., handleException)
    };

    private ReplyHandler cb;

    // ...

    public static String requete(String msg, ReplyHandler cb) throws IOException {
        this.cb = cb;
        out.println(msg);
    }

    public void run() {
        while(...) {
            String line = in.readLine();
            cb.handleReply(line);
        }
    }

You can use it like this:

    ClientSocket.requete("SC 05 "+String.valueOf( x ), new ReplyHandler() {
        public void handleReply(String line) {
            Log.d("Message", "Message caméra envoyé");
        }
    );

Note that, to make it work, handle exceptions, start the thread, and so on. In particular, you might want to add a second method to the ReplyHandler interface to handle exceptions.

Community
  • 1
  • 1
jop
  • 2,226
  • 15
  • 16
  • So i have to put a thread for this " final TextView tvCamera" and this should work ? – user2473943 Jun 12 '13 at 09:11
  • I've added a sketch of the code needed to execute reads in a separate thread. – jop Jun 12 '13 at 09:54
  • I have ReplyHandler cannot be resolved to a type . Then ReplyHandler cb they whant to create a class and And "this".cb = cb; Cannot use a static this in a static context but i need as static to use it... – user2473943 Jun 12 '13 at 09:59
  • Jop can i send you my project to you because I have several problems with your correction ... Thank ! – user2473943 Jun 12 '13 at 10:07
  • You need to define your own `ReplyHandler` interface. I've changed the code accordingly. – jop Jun 12 '13 at 10:19
  • This is too hard for me ... It's new for me . I try with this but i have always the same problem . – user2473943 Jun 12 '13 at 12:44