优雅地终止 Java 在 Android 中打开的进程
Gracefully kill process open by Java in Android
我正在尝试在我的 Android 应用程序中执行 ping 命令并能够取消它/发送中断信号。基本上我想在你发送 ctrl+c 以在任何正常 linux 中执行 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");
}
}
});
到目前为止,我只是尝试终止进程,但会立即停止所有输出。以及如何 "gracefully" 停止由 Java 在 Android 中启动的 ping 命令的想法?
编辑
所以我设法获得了我的 ping 进程的 PID,并通过 adb 控制台验证了它的正确性。我试图用以下方法杀死它:
Runtime.getRuntime().exec("kill -INT " + getPid(process));,没有 ErrorStream 输出但什么也没有发生。与 Process.sendSignal(getPid(process),Process.SIGNAL_QUIT); 相同。有人吗?
问题已解决,事实证明它没有对信号做出反应,因为我 运行 在单独的线程上执行 ping。
我正在尝试在我的 Android 应用程序中执行 ping 命令并能够取消它/发送中断信号。基本上我想在你发送 ctrl+c 以在任何正常 linux 中执行 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");
}
}
});
到目前为止,我只是尝试终止进程,但会立即停止所有输出。以及如何 "gracefully" 停止由 Java 在 Android 中启动的 ping 命令的想法?
编辑
所以我设法获得了我的 ping 进程的 PID,并通过 adb 控制台验证了它的正确性。我试图用以下方法杀死它: Runtime.getRuntime().exec("kill -INT " + getPid(process));,没有 ErrorStream 输出但什么也没有发生。与 Process.sendSignal(getPid(process),Process.SIGNAL_QUIT); 相同。有人吗?
问题已解决,事实证明它没有对信号做出反应,因为我 运行 在单独的线程上执行 ping。