我的目标是将一个设备上的图片复制到另一个设备上,我已设法将路径的坐标发送到网络线程,但无法在第二个设备上处理这些。我将如何使用来自流的坐标尽可能实时地在第二个设备上绘制路径。目前我有一个线程连接:
public class connecting implements Runnable{
Socket sock;
ObjectInputStream ois;
@Override
public void run() {
try{
sock = new Socket("10.42.34.46", 1337);
InputStream is = sock.getInputStream();
ois = new ObjectInputStream(new BufferedInputStream(is));
}catch(IOException ex){
ex.printStackTrace();
}
while(true){
com.DrawTastic.Drawring serverDraw = null;
serverDraw = (com.DrawTastic.Drawring) ois.readObject();
float mX = serverDraw.getMx();
float mY = serverDraw.getMy();
}
}
}
如何让浮点变量在另一个线程中连续绘制到这个onDraw方法
@Override
public void onDraw(Canvas canvas) {
connecting ncoords = new connecting();
mPath.lineTo(mX, mY);
canvas.drawPath(mPath, mPaint);
canvas.drawColor(Color.WHITE);
canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
canvas.drawPath(mPath, mPaint);
}
}
答案 0 :(得分:2)
This is the most basic tutorial关于Java中的客户端/服务器编程。让我们从命名开始
客户端实现onTouchEvent(MotionEvent)
并将x和y坐标写入其套接字OutputStream
。即使您希望它尽可能实时,您可能需要在本地存储事件(x,y和时间戳)并以特定时间间隔传输它们。与其他阻塞操作一样,这将在与主应用程序线程不同的线程上运行。这是一个伪实现
ClientActivity
thread:
while activity_is_running:
sleep 100
socket.write list_of_events
onCreate(): start_background_thread
onViewTouched(): thread.add_event
服务器将ServerSocket
监听活动。每次收到活动时,都会抽奖。请注意,为了从套接字正在侦听的后台线程访问绘图线程,您可以使用Handler
。 Handler只是在特定线程上运行某些代码的一种方法。您只需要为Handler
声明ServerActivity
实例变量并在onCreate
中实例化它:这样Handler
将绑定到应用程序主线程,这也是UI线程。
ServerActivity
thread:
while activity_is_running:
handler.draw socket.get_event_from_input_stream
onCreate():
handler: new Handler()
start_background_thread
最后一部分是如何记住客户端和服务器端已经绘制的东西。这是因为每次调用onDraw
都会为您提供一个干净的位图,因此您必须将每个事件存储在列表中并从该列表中绘制,或者您可以保留已绘制事物的缓存(see this paste )