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(アプリケーションが応答しない)と呼ばれます。

すべてのアプリケーションの応答性が保証する必要があることについて説明しているこの非常に優れた記事を読むことをお勧めします。これはGoogleAndroidチームによって作成され、多くの貴重なアドバイスが含まれています。

于 2013-03-25T20:49:55.463 に答える
0

コメントより少し多くのスペースが必要です...

キーポイント:クラスを作成しても、スレッド拡張クラス(、、など)でない限り、スレッドは作成されませAsyncTaskThread

通常、アプリケーションの場合、サーバーは1つのスレッドで実行され、ゲームロジックは別のスレッドで実行され、イメージアップデーターは3番目のスレッドで実行され、UIスレッドは、表示する新しいものがあると通知されたときに、この3番目のスレッドから表示を更新します。

同様のアプローチの例は、http://www.javacodegeeks.com/2011/07/android-game-development-basic-game_05.htmlにあります。それを出発点として使用し、同様の基準でサーバースレッドを追加することをお勧めします。これにより、問題が解決するはずです。

あなたがすでに知っていることをあなたに話しているなら申し訳ありませんが、申し訳ありませんより安全です。

于 2013-03-25T22:31:58.803 に答える