Java 为什么当应用程序暂停或停止时,服务中的套接字变为空?

Java 为什么当应用程序暂停或停止时,服务中的套接字变为空?,java,android,sockets,Java,Android,Sockets,我有一个简单的应用程序,它使用套接字连接通过服务进行p2p通信。据我所知,当应用程序被破坏时,服务将继续运行,需要停止。但是,当我的应用程序暂停或停止时(即活动不可见),服务器中的套接字将变为null,应用程序将崩溃 下面是我的活动中启动服务的方法 public void startServerService(){ //if (!serverThreadActive) { serverServiceIntent = new Intent(this, ServerServ

我有一个简单的应用程序,它使用套接字连接通过服务进行p2p通信。据我所知,当应用程序被破坏时,服务将继续运行,需要停止。但是,当我的应用程序暂停或停止时(即活动不可见),服务器中的套接字将变为null,应用程序将崩溃

下面是我的活动中启动服务的方法

public void startServerService(){

    //if (!serverThreadActive) {
        serverServiceIntent = new Intent(this, ServerService.class);

        //serverServiceIntent.putExtra("GoAddress", goAddress);
        serverServiceIntent.putExtra("GOPort", prefixedPort);
        serverServiceIntent.putExtra("Result", new ResultReceiver(null){

            @Override
            protected void onReceiveResult(int resultCode, final Bundle resultData) {

                //String message = resultData.getString("msg");
                //addLine(message);   //back from ServerService with mssg so add to textview line 181
                final TextView tv = (TextView) findViewById(R.id.rcvd);
                tv.post(new Runnable() {
                    @Override
                    public void run() {
                        tv.append("\n" + (String)resultData.get("msg"));
                    }
                });

            }
        });

        serverThreadActive = true;
        startService(serverServiceIntent);
}
这里是服务本身

   public class ServerService extends IntentService{

    //DECLARATIONS
    private boolean serviceEnabled;
    private int mGoPort = 8080;
    private String message;
    private ResultReceiver serverResult;
    private InetAddress mGoAddress;
    private ServerSocket mServerSocket;
    private Thread mServerThread;


    public ServerService(){
        super("ServerService");
        serviceEnabled =  true;
    }

    @Override
    public void onCreate() {
        super.onCreate();

        android.os.Debug.waitForDebugger();
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        //mGoPort = (Integer) intent.getExtras().get("GOPort");
        //mGoAddress = (InetAddress)intent.getExtras().get("GOAddress");
        serverResult = (ResultReceiver)intent.getExtras().get("Result");

        mServerThread = new Thread(new ServerThread());
        mServerThread.start();
    }

    class ServerThread implements Runnable{

        @Override
        public void run() {

            Socket socket;

            try {
                mServerSocket = new ServerSocket(mGoPort);
            } catch (IOException e) {
                e.printStackTrace();
            }

            while (!Thread.currentThread().isInterrupted()){

                try {
                    socket = mServerSocket.accept();            //THIS SOCKET IS NULL AFTER APP
                                                                //STOP AND RESTART
                    CommunicationThread commThread = new CommunicationThread(socket);
                    new Thread(commThread).start();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    class CommunicationThread implements Runnable{

        private Socket clientSocket;
        private BufferedReader input;

        public CommunicationThread(Socket clientSocket){
            this.clientSocket = clientSocket;

            try {
                this.input = new BufferedReader(new InputStreamReader
                        (this.clientSocket.getInputStream()));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void run() {

            while (!Thread.currentThread().isInterrupted()){

                try {
                    String read = input.readLine();
                    updateMessages(read, false);
                    //input.close();                  //TRY TO FIX CRASH
                    //clientSocket.close();           //ADDED TO TRY TO FIX CRASH
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public synchronized void updateMessages(String msg, boolean local){

        android.os.Debug.waitForDebugger();
        if (local) {
            msg = "me: " + msg;
        }
        else{
            msg = "them: " + msg;
        }

        Bundle messageBundle = new Bundle();
        messageBundle.putString("msg", msg);

        serverResult.send(mGoPort, messageBundle);
    }
}
当应用程序暂停或停止时,如按下设备上的home(主页)按钮,变量mServerSocket将变为null

socket = mServerSocket.accept();            //THIS SOCKET IS NULL AFTER APP
                                            //STOPS AND RESTARTS
我如何修复此问题,以便通信能力在故障后仍能正常工作 活动暂停并重新启动还是停止并重新启动

感谢您提供的任何想法、提示或线索

哦,这是舱单部分

<service android:name=".ServerService"
    android:enabled="true"
    android:exported="false"/>


另一个更新-即使是在OnHandleContent中等待的套接字在主活动暂停后仍然变为空。

这是intentservice,您的理解是错误的。。。它生成自己的线程,您应该只在OnHandleContent中执行这些操作。
mServerSocket
定义在哪里?@Selvin-谢谢。我有点明白你的意思。将在更改后报告。@EJP-对此表示抱歉。我删去了第一部分的声明