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