2017-09-13 3 views
0

私はスタートボタンを持っているアプリを作って、クライアントソケットがサーバーソケットを介して自分のPCに接続するクライアントスレッドサービス。アプリケーションが最近のリストからクリアされるまでうまく動作します。私はスタートボタンを押してアプリケーションを閉じるためにfinish()を実行しても同じことは起こりません。サービスはどちらの場合でも実行されますが、最近のリストからアプリケーションをクリアすると、サービスは実行され続けますが、私のサーバーアプリケーション「ソフトウェアは接続を中止しました:ソケット書き込みエラーです」でエラーが発生します。また、finish()を使用してアプリケーションを終了すると、最近のリストからもクリアされますが、ソケットはエラーが発生することなくサービスが正常に実行され続けます。ソフトウェアの接続が中止されました:最近のリストからアプリケーションをクリアする際にソケット書き込みエラーが発生しました(サービスとは別のスレッドで実行中)

私は何をすべきですか?

私の英語で申し訳ありません、私の母国語ではありません。

MainActivity.java

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Intent serviceIntent = new Intent(getBaseContext(), ClientService.class); 
} 

//This is called when I click the start button 
public void ServiceToggle(View v) { 
    if (!isServiceRunning(ClientService.class)) { 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       startService(serviceIntent); 
      } 
     }).start(); 
    } else { 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       stopService(serviceIntent); 
      } 
     }).start(); 
    } 
} 

ClientService.java

public class ClientService extends Service { 
    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     super.onCreate(); 
     handler = new Handler(); 
     new Thread(new Client()).start(); 

     return START_STICKY; 
    } 

    class Client implements Runnable { 
     String message; 

     @Override 
     public void run() { 
      try { 
       socket = new Socket(IP, PORT); 

       objectInputStream = new ObjectInputStream(socket.getInputStream()); 

       while (true) { 
        message = (String) objectInputStream.readObject(); 

        UpdateOnUI(message); 
       } 
      } catch(Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    public void UpdateOnUI(final String string) { 
     handler.post(new Runnable() { 
      @Override 
      public void run() { 
       Toast.makeText(getApplicationContext(), string, Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 
} 

エラーがないサーバー側(Windowsの場合)からクライアント側(アンドロイド)からのものであり、中に尋ねた他の質問は異なっていますスタックオーバーフロー。このエラーは、アプリケーションがタスクから閉じられ、サービスが実行され続け、ソケットがサービス内で実装され、サービスではなくアクティビティを閉じるときにスローされます。

+0

アクティビティとサービスのコードを追加してください。 –

+0

startService(serviceIntent)の後にfinish()を使用するとします。 MainActivityでアプリを閉じるために私が話したエラーは起こりません。 –

+0

@Jensこのメッセージの正式な理由は、あなたが個人的にそれを知っているかどうかにかかわらず、重複して引用されているとおりです。 – EJP

答えて

0

これで動作します。サービスをForegroundで動作させるために必要でした。それを前景にするのは、愚かな間違いのために以前はうまくいきませんでした。別のスレッドで実行していましたが、実行するのを忘れました(.start()を呼び出さなかった)。

関連する問題