Note that there are some explanatory texts on larger screens.

plurals
  1. POsending and stopping data via socke OnTouchListner
    text
    copied!<p>i have write this peace of code to send data via socket while the imageview is pressed<br> it works fine but afte i leave the imageview it still sends data<br> i am sure that the problem is in android part.<br> what is wrong with this code ? </p> <pre><code> package com.example.paradroid; import java.io.IOException; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.EditText; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import android.util.Log; public class MainActivity extends Activity { static final String RIGHT = "2"; static final String LEFT = "4"; static final String UP = "1"; static final String DOWN = "3"; static final String STOP = "5"; InetAddress serverAddress; Socket socket; // ---all the Views--- static TextView txtMessagesReceived; EditText txtMessage; // ---thread for communicating on the socket--- CommsThread commsThread; // ---used for updating the UI on the main activity--- static Handler UIupdater = new Handler() { @Override public void handleMessage(Message msg) { int numOfBytesReceived = msg.arg1; byte[] buffer = (byte[]) msg.obj; // ---convert the entire byte array to string--- String strReceived = new String(buffer); // ---extract only the actual string received--- strReceived = strReceived.substring(0, numOfBytesReceived); // ---display the text received on the TextView--- // txtMessagesReceived.setText(txtMessagesReceived.getText() // .toString() + strReceived); } }; private class CreateCommThreadTask extends AsyncTask&lt;String[], Integer, Void&gt; { @Override protected Void doInBackground(String[]... params) { try { // ---create a socket--- serverAddress = InetAddress.getByName(params[0][0]); int port = Integer.parseInt(params[0][1]); // --remember to change the IP address above to match your own-- socket = new Socket(serverAddress, port); commsThread = new CommsThread(socket); commsThread.start(); } catch (UnknownHostException e) { Log.d("Sockets", e.getLocalizedMessage()); } catch (IOException e) { Log.d("Sockets", e.getLocalizedMessage()); } return null; } } private class WriteToServerTask extends AsyncTask&lt;String, Void, Void&gt; { protected Void doInBackground(String... data) { commsThread.write(data[0]); return null; } } private class CloseSocketTask extends AsyncTask&lt;Void, Void, Void&gt; { @Override protected Void doInBackground(Void... params) { try { socket.close(); } catch (IOException e) { Log.d("Sockets", e.getLocalizedMessage()); } return null; } } /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // ---get the views--- final ImageView im_up = (ImageView) findViewById(R.id.imageView2); final ImageView im_right = (ImageView) findViewById(R.id.imageView3); final ImageView im_down = (ImageView) findViewById(R.id.imageView1); final ImageView im_left = (ImageView) findViewById(R.id.imageView4); im_up.setOnTouchListener(new TheOnTouchListner(1)); im_right.setOnTouchListener(new TheOnTouchListner(2)); im_down.setOnTouchListener(new TheOnTouchListner(3)); im_left.setOnTouchListener(new TheOnTouchListner(4)); } private class TheOnTouchListner implements OnTouchListener { private Handler mHandler; private int tag; public TheOnTouchListner(int t) { this.tag = t; } @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub if (event.getAction() == MotionEvent.ACTION_DOWN) { if (mHandler != null) return true; mHandler = new Handler(); mHandler.postDelayed(mAction, 500); } else if (event.getAction() == MotionEvent.ACTION_UP) { if (mHandler == null) return true; mHandler.removeCallbacks(mAction); mHandler = null; return false; } return false; } Runnable mAction = new Runnable() { @Override public void run() { onClickSend(tag); mHandler.postDelayed(this, 500); } }; } public void onClickSend(int tag) { // ---send the message to the server--- if (tag == 1) { sendToServer(UP); } else if (tag == 2) { sendToServer(RIGHT); } else if (tag == 3) { sendToServer(DOWN); } else if (tag == 4) { sendToServer(LEFT); } } public void onClickConnect(View view) { String[] params = new String[2]; params[0] = ((EditText) findViewById(R.id.IPText)).getText().toString(); params[1] = ((EditText) findViewById(R.id.PortText)).getText() .toString(); new CreateCommThreadTask().execute(params); Toast.makeText(getBaseContext(), "connected!", Toast.LENGTH_SHORT) .show(); } private void sendToServer(String message) { // byte[] byteArray = new byte[1]; // byteArray[0] = message; new WriteToServerTask().execute(message); } @Override public void onResume() { super.onResume(); } @Override public void onPause() { super.onPause(); sendToServer("bye."); // defined in server that this string terminates // connection new CloseSocketTask().execute(); } </code></pre> <p>} CommsThread class :</p> <pre><code> package com.example.paradroid; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import android.util.Log; import java.io.PrintWriter; public class CommsThread extends Thread { private final Socket socket; private final InputStream inputStream; private final OutputStream outputStream; private final PrintWriter out; public CommsThread(Socket sock) throws IOException { socket = sock; InputStream tmpIn = null; OutputStream tmpOut = null; try { tmpIn = socket.getInputStream(); tmpOut = socket.getOutputStream(); } catch (IOException e) { Log.d("SocketChat", e.getLocalizedMessage()); } inputStream = tmpIn; outputStream = tmpOut; out = new PrintWriter(sock.getOutputStream(), true); } public void run() { } public void write(String bytes) { out.println(bytes); } public void cancel() { try { socket.close(); } catch (IOException e) { } } </code></pre> <p>}</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload