DatagramSocket接收时,Android onTouchEvent不起作用

时间:2013-03-25 20:17:10

标签: java android adb

我试图允许我的用户在屏幕上移动一个块,同时还在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的运行,它现在可以正常运行而没有问题,我可以使用我的应用程序并等待客户端连接,这应该工作正常,干杯帮助人们。

帆布

2 个答案:

答案 0 :(得分:1)

在Android中,每个View相关方面都应该在主线程中处理,即UI线程。耗时,繁重的计算或简单的阻塞任务应保留在另一个线程中,以避免冻结用户界面。

保持用户界面流畅和响应非常重要。如果不这样做,ActivityManager肯定会弹出一个警告框,询问用户是否要关闭您的应用程序,因为它没有正确响应他的交互。这称为ANR(应用程序未响应)。

您可能希望阅读此very good article,了解每个应用程序应该保证的响应性。它由Google Android团队撰写,包含很多的宝贵建议。

答案 1 :(得分:0)

我需要比评论更多的空间......

关键点:创建类不会创建线程,除非它们是线程扩展类(AsyncTaskThread等)。

通常,对于您的应用程序,服务器将在一个线程中运行,游戏逻辑在另一个线程中运行,图像更新程序在第三个线程中,UI线程将在被告知有新事物要显示时从第三个线程刷新显示。

http://www.javacodegeeks.com/2011/07/android-game-development-basic-game_05.html中给出了类似方法的一个例子。我建议使用它作为一个起点,并在类似的基础上添加一个额外的服务器线程,这应该可以解决问题。

很抱歉,如果我告诉你你已经知道的东西,但比抱歉更安全。