【问题标题】:Gracefully kill process open by Java in Android在Android中优雅地杀死Java打开的进程
【发布时间】:2016-09-25 22:38:28
【问题描述】:

我正在尝试在我的 Android 应用程序中执行 ping 命令并能够取消它/发送中断信号。基本上,我想在任何普通 linux 中发送 ctrl+c 来 ping 之后获得 ping 统计信息。 我已经阅读了Send Ctrl-C to process open by Java,但它针对的是 Windows 平台,而且 tbh 似乎有点矫枉过正。我执行命令的代码(我正在使用 rxjava):

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 命令?

编辑

所以我设法获取了我的 ping 进程的 PID,并通过 adb 控制台验证了它的正确性。我试图用以下方法杀死它: Runtime.getRuntime().exec("kill -INT " + getPid(process));,没有 ErrorStream 输出但什么也没发生。 Process.sendSignal(getPid(process),Process.SIGNAL_QUIT); 相同。有人吗?

【问题讨论】:

    标签: java android rx-java ping rx-android


    【解决方案1】:

    问题解决了,结果它没有对信号做出反应,因为我在单独的线程上运行 ping。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-18
      • 1970-01-01
      • 2016-11-12
      • 1970-01-01
      • 2020-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多