2016-09-25 19 views
3

私のAndroidアプリケーションでpingコマンドを実行しようとしていますが、キャンセル/中断信号を送ることができます。基本的には、通常のLinuxでpingにCtrl + Cを送るときのように、pingの統計を取得したいのです。 私はSend Ctrl-C to process open by Javaを読みましたが、それはWindowsプラットフォームを目指しており、tbhは少し残酷に思えます。私の(私はrxjavaを使用しています)コマンドを実行するためのコード:AndroidでJavaでプロセスを正常に終了させる

public rx.Observable<String> getPingOutput(String address) 
{ 
    return rx.Observable.create(new rx.Observable.OnSubscribe<String>() 
    { 
     @Override 
     public void call(Subscriber<? super String> subscriber) 
     { 
      try 
      { 
       process = Runtime.getRuntime().exec("ping -c 4 " + address); 
       BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream())); 
       String s; 
       while ((s = stdInput.readLine()) != null) 
       { 
        subscriber.onNext(s); 
       } 
       subscriber.onCompleted(); 
       process.destroy(); 
       stdInput.close(); 
      } 
      catch (IOException e) 
      { 
       subscriber.onError(e); 
       if(process != null) 
       { 
        process.destroy(); 
       } 
      } 
     } 
    }); 
} 

そしてキャンセル/開始:

RxView.clicks(pingButton) 
       .subscribe(new Action1<Void>() 
       { 
        @Override 
        public void call(Void aVoid) 
        { 
         if (isPingInProgress()) 
         { 
          process.destroy(); 
          subscription.unsubscribe(); 
          isPing = false; 
          pingButton.setText("Ping"); 
         } 
         else 
         { 
          if(adapter!= null) 
          { 
           adapter.clear(); 
           adapter.notifyDataSetChanged(); 
          } 
          String address = addressInput.getText().toString(); 
          subscription = getPingOutput(address) 
            .subscribeOn(Schedulers.newThread()) 
            .observeOn(AndroidSchedulers.mainThread()) 
            .subscribe(myObserver); 
          isPing = true; 
          pingButton.setText("Stop"); 
         } 
        } 
       }); 

をこれまでのところ、私はちょうどプロセスを殺すが、それはすぐにすべての出力を停止してみました。そして、アイデアはどうやってAndroid上でJavaによって開始されるpingコマンドを「優雅に」止めることができますか?

EDIT

は、だから私は、私のpingプロセスのPIDを取得するために管理し、ADBコンソール経由でその正しいことを確認しました。私はそれを使用してそれを殺そうとしました: Runtime.getRuntime()。exec( "kill -INT" + getPid(process)); ErrorStream出力はありませんが、何も起こりません。 Process.sendSignal(getPid(process)、Process.SIGNAL_QUIT);と同じです。誰でも?

答えて

0

解決済みの問題は、別のスレッドでpingを実行したために信号に反応しなかったことが分かります。

関連する問題