【问题标题】:Random stopping in Android ActivityAndroid Activity 中的随机停止
【发布时间】:2013-12-11 20:23:04
【问题描述】:

我正在使用 UDP 服务器开发多人游戏,但我不明白为什么我的服务器线程在其循环的第一次迭代后自行停止。这是启动线程的 Activity 的代码:

public class GameActivity extends Activity {

public ServerUDP t;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
                            WindowManager.LayoutParams.FLAG_FULLSCREEN);

    setContentView(R.layout.activity_game);
    t = new ServerUDP();
    t.setRunning(true);
    t.start();
}

@Override
protected void onPause()
{
    super.onPause();
    t.setRunning(false);
    t.interrupt();
}


@Override
protected void onDestroy()
{
    super.onDestroy();
    t.setRunning(false);
    t.interrupt();

}
}

这是服务器代码:

 public class ServerUDP extends Thread 
 {
    private boolean mRun;

    private DatagramSocket serverSocket ;
    private byte[] receiveData;
    private byte[] sendData;
    private int ServerPort = 9000;

    ServerUDP()
    {
        try {
            if(serverSocket == null)
            {
                serverSocket = new DatagramSocket(null);
                serverSocket.setReuseAddress(true);
                serverSocket.bind(new InetSocketAddress(ServerPort));
                receiveData = new byte[1024];
                sendData = new byte[1024];
            }
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run()
    {
        while (mRun) 
        {
            Log.v("socket","in loop");
            sendData = "test".getBytes();
            InetAddress local;
            try {
                local = InetAddress.getByName("10.0.2.2");
                Log.v("socket","Sent"+sendData);
                DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length,local, 8088);
                serverSocket.send(sendPacket);
            } catch (IOException e) {
                e.printStackTrace();
            }


            DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
            try {
                serverSocket.receive(receivePacket);
            String receiveString = new String( receivePacket.getData());
            Log.v("RECEIVED",receiveString); 
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }
    public void setRunning(boolean b) 
    {
        mRun = b;
    }

}

问题是我只收到一条“循环中”消息。我的线程似乎在一个循环后死了。我在调试模式下进行了检查,它仍然存在,但它不再通过服务器循环。

有什么想法吗?

【问题讨论】:

    标签: java android multithreading android-activity


    【解决方案1】:

    我猜你的线程在 send()receive() 调用中阻塞等待来自你的服务器的响应。

    【讨论】:

      【解决方案2】:

      它可能会遇到IOException 以外的异常(源自RuntimeException 的未经检查的异常)。尝试将 run 方法中的所有内容包装在 try...catch(Exception e) 块中。

      【讨论】:

        猜你喜欢
        • 2012-10-14
        • 2012-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-14
        • 2019-12-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多