0

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

帆布

4

2 回答 2

1

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

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

您可能想阅读这篇非常好的文章,讨论每个应用程序应保证的响应能力。它由 Google Android 团队编写,包含许多宝贵的建议。

于 2013-03-25T20:49:55.463 回答
0

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

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

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

http://www.javacodegeeks.com/2011/07/android-game-development-basic-game_05.html中给出了类似方法的一个示例。我建议以此为起点,并在类似的基础上添加一个额外的服务器线程,这应该可以让事情顺利进行。

对不起,如果我告诉你一些你已经知道的事情,但安全总比抱歉好。

于 2013-03-25T22:31:58.803 回答