繁体   English   中英

DatagramSocket正在接收时,Android onTouchEvent无法正常工作

[英]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团队编写,包含许多宝贵的建议。

我需要的空间比评论多一点...

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

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

http://www.javacodegeeks.com/2011/07/android-game-development-basic-game_05.html中提供了类似方法的示例。 我建议以此为起点,并在类似的基础上添加一个额外的Server线程,这应该可以解决问题。

抱歉,如果我告诉您您已经知道的内容,但是比后悔更安全。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM