我试图为Android制作一个远程鼠标应用程序(通过TCP从电话上控制PC上的鼠标)。在客户端(android)上,我在UIThread中实现了OnTouchListener,但客户端套接字和IO在另一个线程中运行。服务器接收坐标,但只有一次,即使客户端正在发送一段时间(true)循环,并且将手指移动到手机显示屏上。它应该永久发送最近的坐标,不仅是第一个坐标。实时向服务器发送数据
public class MainActivity extends Activity implements OnTouchListener {
private ServerSocket ss;
private Socket socket;
TextView tv;
String x, y;
private static final int SERVERPORT = 444;
private static final String SERVER_IP = "192.168.1.3";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.textView1);
RelativeLayout l = (RelativeLayout) findViewById(R.id.myView);
l.setOnTouchListener(this);
}
class Worker implements Runnable{
PointF point;
public Worker(PointF point) {
this.point = point;
}
@Override
public void run() {
try {
InetAddress adress = InetAddress.getByName(SERVER_IP);
socket = new Socket("192.168.1.3", SERVERPORT);
BufferedWriter obf = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
obf.write(point.x+" "+point.y);
obf.flush();
obf.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
ExecutorService executor = Executors.newFixedThreadPool(5);
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_MOVE:
x=String.valueOf(event.getX());
y=String.valueOf(event.getY());
tv.setText(x+" + "+y);
PointF point = new PointF(event.getX(), event.getY());
executor.execute(new Worker(point));
break;
default:
break;
}
return true;
}
}
你可以使用线程池与队列此。 – Krish
线程池如何工作?到底有什么好处呢? – user2208931
参考此链接http://www.javacodegeeks.com/2013/01/java-thread-pool-example-using-executors-and-threadpoolexecutor.html – Krish