4

次のように独自のAndroidサービスを実装しました

public class MyService extends Service {
    private static final String TAG = "MyService";

    private Server mServer; 
    private LocalServerSocket server;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        Log.d(TAG, "onCreate");
        mServer = new Server();
        mServer.start();
    }

    @Override
    public void onDestroy() {
        Log.d(TAG, "onDestroy");
        if(server != null){
            try {
                server.close();
            } catch (IOException e) {
                Log.d(TAG, "exception in server close");
                e.printStackTrace();
            }
        }
    }

    @Override
     public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "onStart");
        return START_STICKY;
    }

    class Server extends Thread {
    @Override
        public void run() {
             try {
                server = new LocalServerSocket("my.socket");
                while (true) {
                    LocalSocket receiver;
                    try{
                        receiver = server.accept();
                    }catch(SocketException e){
                        Log.d(TAG, "SocketException");
                        break;
                    }
                    catch(IOException e){
                        Log.d(TAG, "IOException");
                        break;
                    }
                    if (receiver != null) {
                        Log.d(TAG, "Got Data in receiver");
                    }
                    receiver.close();
                }
            } catch (IOException e) {
                Log.d(TAG, "one more");
                e.printStackTrace();
            }
        }
    }
}

私が直面している問題は、LocalServerSocket が accept() でブロックされている場合、OnDestroy() で server.close() を呼び出しても SocketException がスローされないことです。したがって、次回サービスを開始すると、「アドレスは既に使用されています」という例外が発生します。LocalServerSocket の代わりに java.net.Socket を使用すると、必要な動作が得られます。LocalServerSocket が Java ソケットと異なる動作をする理由を知りたいです。私の場合、while ループから抜け出す方法を教えてください。

4

2 に答える 2

0

あなたが投稿したコードから、あなたは永遠LocalServerSocket serverに残り、それを閉じないように見えます。また、通常、ソケットを閉じても IOException はスローされませんが、ソケットが同時に閉じられた場合はスローされます。nullonDestroy()accept()

于 2011-11-04T13:16:59.310 に答える