[英]Android onTouchEvent won't work while DatagramSocket is receiving
我试图允许我的用户在屏幕上移动块,同时还监听DatagramSocket上的连接,这是我的onTouchEvent
public boolean onTouchEvent( MotionEvent event )
{
if ( event.getAction() == MotionEvent.ACTION_DOWN )
{
if( event.getY() > getHeight() - 50 )
{
gameState.setRunning( false );
((Activity)getContext()).finish();
}
else
{
touched = true;
Log.d(TAG, "Coords: x=" + event.getX() + ",y=" + event.getY());
}
checkCollisions( event.getX(), event.getY() );
}
if ( event.getAction() == MotionEvent.ACTION_MOVE )
{
checkCollisions( event.getX(), event.getY() );
}
if ( event.getAction() == MotionEvent.ACTION_UP )
{
touched = false;
}
return true;
}
这是我的服务器代码
public void run()
{
Log.d(TAG, "Ip address used:" + getLocalIPAddress() );
while( true )
{
//Receive some data
byte[] buf = new byte[256];
DatagramPacket packet = new DatagramPacket( buf, buf.length );
try
{
socket.receive( packet );
}
catch (IOException e)
{
Log.d(TAG, "Error with receiving data");
e.printStackTrace();
}
String data = new String( buf, 0, packet.getLength() );
Log.d(TAG, "Data received was :" + data);
}
}
现在我的服务器工作正常,但是在服务器等待连接时,客户端无法执行任何操作,现在我知道可以启动线程了,但是那还会阻止onTouchEvent吗?
帆布
更新资料
我使用AsyncTask将其实现为doInBackground,现在可以正常运行了,而且没有问题,我可以玩我的应用程序,也可以等待客户端连接,这应该很好,为帮助人员加油打气。
帆布
在Android中,每个与View
相关的方面都应在主线程(即UI线程)中处理。 费时,繁重的计算或简单的阻止任务应保留在另一个线程中,以避免冻结用户界面。
保持用户界面流畅和响应很重要,这一点很重要。 如果您不这样做, ActivityManager
肯定会最终弹出一个警告框,询问用户是否要关闭您的应用程序,因为该应用程序无法正确响应其交互。 这称为ANR
(应用程序无响应)。
您可能想阅读这篇很好的文章,其中谈到了每个应用程序应确保的响应能力。 它由Google Android团队编写,包含许多宝贵的建议。
我需要的空间比评论多一点...
重点:创建类不会创建线程,除非它们是线程扩展类( AsyncTask
, Thread
等)。
通常,对于您的应用程序,服务器将在一个线程中运行,游戏逻辑在另一个线程中运行,图像更新程序在第三线程中运行,UI线程将在得知有新内容要显示时从第三线程刷新显示。
http://www.javacodegeeks.com/2011/07/android-game-development-basic-game_05.html中提供了类似方法的示例。 我建议以此为起点,并在类似的基础上添加一个额外的Server线程,这应该可以解决问题。
抱歉,如果我告诉您您已经知道的内容,但是比后悔更安全。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.