2016-09-25 4 views
3

내 Android 애플리케이션에서 ping 명령을 실행하려고 시도 중이며이를 취소/중단 신호를 보낼 수 있습니다. 기본적으로 나는 ping 통계를 얻고 싶다. 보통 리눅스에서 ping을 할 때 ctrl + c를 보내면된다. 나는 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"); 
         } 
        } 
       }); 

지금까지 난 그냥 프로세스를 죽이는 시도하지만 즉시 모든 출력을 정지합니다. 그리고 어떻게 안드로이드에서 자바가 시작한 ping 명령을 "우아하게"멈출 수 있습니까?

편집 그래서 내가 내 핑 프로세스의 PID를 얻을 관리, ADB 콘솔을 통해 올바른을 확인했습니다. 나는 그것을 사용하여 죽이려고했다 : Runtime.getRuntime(). exec ("kill -INT"+ getPid (process)); ErrorStream 출력은 없지만 아무 일도 일어나지 않는다. Process.sendSignal (getPid (process), Process.SIGNAL_QUIT);와 동일합니다. 누군가?

답변

0

문제가 해결되어 별도의 스레드에서 핑을 실행했기 때문에 신호에 반응하지 않았습니다.