Android : When add messages for Echo Server with Socket

on Tuesday, September 9, 2014


My app must draw lines green color and send drawing data to echo server, when server get answer re-draw green line on black. So i don't know where i have to send messages to server, because when i do ACTION_UP, sending stops. My code:



public class MyActivity extends Activity{

private WebSocketClient mWebSocketClient;
private Paint mPaint;
private Paint socketPaint;
private Path socketPath;
private Bitmap mBitmap;
private Canvas mCanvas;
private Path mPath;
private LinkedList<String> socketMessages;
private String[] tokens;
private String comma = "[,]";

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new MyView(this));

mPaint = new Paint();
mPaint.setColor(Color.GREEN);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(1);

socketPaint = new Paint();
socketPaint.setColor(Color.BLACK);
socketPaint.setStyle(Paint.Style.STROKE);
socketPaint.setStrokeWidth(3);
socketMessages = new LinkedList<String>();
connectWebSocket();
}

public void connectWebSocket() {
URI uri = null;
try {
uri = new URI("ws://echo.websocket.org");
} catch (URISyntaxException e) {
e.printStackTrace();
}

mWebSocketClient = new WebSocketClient(uri) {

@Override
public void onOpen(ServerHandshake handshakedata) {
Log.i("Websocket", "Opened");

}

@Override
public void onMessage(String s) {
final String message = s;
runOnUiThread(new Runnable() {
@Override
public void run() {
tokens = message.split(comma);
socketPath.moveTo(Float.valueOf(tokens[0]), Float.valueOf(tokens[1]));
socketPath.quadTo(Float.valueOf(tokens[2]), Float.valueOf(tokens[3]), (Float.valueOf(tokens[2]) + Float.valueOf(tokens[0]))/2, (Float.valueOf(tokens[3]) + Float.valueOf(tokens[1]))/2);
socketPath.lineTo(Float.valueOf(tokens[2]), Float.valueOf(tokens[3]));
mCanvas.drawPath(socketPath, socketPaint);
socketPath.reset();
}
});
}

@Override
public void onClose(int code, String reason, boolean remote) {
Log.i("Websocket", "Closed " + reason);

}

@Override
public void onError(Exception ex) {
Log.i("Websocket", "Error " + ex.getMessage());
}
};
mWebSocketClient.connect();
}

public void sendMessages(){

while(!socketMessages.isEmpty()){
mWebSocketClient.send(socketMessages.getFirst());
if(!socketMessages.isEmpty())
socketMessages.removeFirst();
}
}

public class MyView extends View {

private float mX, mY;

public MyView(Context c) {
super(c);
mPath = new Path();
socketPath = new Path();
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
mCanvas = new Canvas(mBitmap);
}

@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.WHITE);
canvas.drawBitmap(mBitmap, 0, 0, mPaint);
canvas.drawPath(mPath, mPaint);
canvas.drawPath(socketPath, socketPaint);
}

private void touch_start(float x, float y) {
mPath.reset();
mPath.moveTo(x, y);
mX = x;
mY = y;
}

private void touch_move(float x, float y) {
mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);


//Maybe here LinkedList doesn't have enough time



socketMessages.add(String.valueOf(mX) + "," +String.valueOf(mY) + "," + String.valueOf(x) + "," + String.valueOf(y));
mX = x;
mY = y;

}

private void touch_up() {
mPath.lineTo(mX, mY);
mCanvas.drawPath(mPath, mPaint);
mPath.reset();
}

@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();

switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
touch_start(x, y);
invalidate();
break;
case MotionEvent.ACTION_MOVE:
touch_move(x, y);


//Or here when touch event done, this method not working



sendMessages();
invalidate();
break;
case MotionEvent.ACTION_UP:
touch_up();
invalidate();
break;
}
return true;
}
}


}


0 comments:

Post a Comment