我试图允许我的用户在屏幕上移动一个块,同时还在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的运行,它现在可以正常运行而没有问题,我可以使用我的应用程序并等待客户端连接,这应该工作正常,干杯帮助人们。
帆布
答案 0 :(得分:1)
在Android中,每个View
相关方面都应该在主线程中处理,即UI线程。耗时,繁重的计算或简单的阻塞任务应保留在另一个线程中,以避免冻结用户界面。
保持用户界面流畅和响应非常重要。如果不这样做,ActivityManager
肯定会弹出一个警告框,询问用户是否要关闭您的应用程序,因为它没有正确响应他的交互。这称为ANR
(应用程序未响应)。
您可能希望阅读此very good article,了解每个应用程序应该保证的响应性。它由Google Android团队撰写,包含很多的宝贵建议。
答案 1 :(得分:0)
我需要比评论更多的空间......
关键点:创建类不会创建线程,除非它们是线程扩展类(AsyncTask
,Thread
等)。
通常,对于您的应用程序,服务器将在一个线程中运行,游戏逻辑在另一个线程中运行,图像更新程序在第三个线程中,UI线程将在被告知有新事物要显示时从第三个线程刷新显示。
http://www.javacodegeeks.com/2011/07/android-game-development-basic-game_05.html中给出了类似方法的一个例子。我建议使用它作为一个起点,并在类似的基础上添加一个额外的服务器线程,这应该可以解决问题。
很抱歉,如果我告诉你你已经知道的东西,但比抱歉更安全。