【问题标题】:How to stop a currently executing command如何停止当前正在执行的命令
【发布时间】:2015-08-02 00:38:33
【问题描述】:
int count = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    setContentView(R.layout.main);

    Button start = (Button) findViewById(R.id.start);

    start.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {

                    try {

                        String[] cmd = new String[] { "logcat", "-f",Environment.getExternalStorageDirectory()+"/log.txt", "-v", "time" };
                        Runtime.getRuntime().exec(cmd);
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                }
            });

            thread.start();

        }
    });

    Button stop = (Button) findViewById(R.id.stop);

    stop.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            try {
                Runtime.getRuntime().exec("logcat -d");
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


        }
    });

    Button addLog = (Button) findViewById(R.id.addLog);

    addLog.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            Log.e("logTag", Integer.toString(count));
            count ++ ;

        }
    });
}

我想使用start 按钮开始保存我的应用程序日志,并使用stop 停止它。 addLog 按钮用于查看是否有更多行被添加到log.txt 文件中。 start 按钮可以正常工作,但问题是它永远不会以stop 结束。 即使在按下stop 之后,当我按下addLog 按钮并检查log.txt 文件,我看到最后一行已添加。 我有什么错?

我需要开始直播,关闭此活动并参观其他活动,然后再回来关闭伐木机。

【问题讨论】:

    标签: android android-logcat android-runtime java-threads


    【解决方案1】:

    是的,您可以通过将 Process 保存在运行时的 exec() 方法返回的变量中并在该变量上调用 destroy() 来实现。

    public abstract void destroy()

    终止此进程并关闭任何关联的 流。

    让我们把进程记录为一个全局变量;

    private Process p;
    

    以及执行时

    p = Runtime.getRuntime().exec(cmd);
    

    它是如何停止的。

    void stopProcess() {
         if (p != null) {
             p.destroy();
         } else {
             Log.d(TAG, "stopProcess: p==null");
         }
    }
    

    【讨论】:

    • 非常感谢。我知道它会起作用,但我还有另一个问题阻止我使用你解释的方法。我需要启动流,关闭此活动并参观其他活动,然后返回并关闭伐木机。你能帮助我吗 ? @hegazy
    • 请回答好吗?
    • 抱歉,我没空。你还有什么问题吗?
    【解决方案2】:

    只需使用@hegazy 方法并在Application 类中保存对进程的引用。不要忘记在您的清单中register 它。希望你明白我的想法。

    类似的东西:

    ((App)getApplicationContext).process = Runtime.getRuntime().exec(cmd);
    

    比你需要的时候拿这个:

    ((App)getApplicationContext).process.exec("logcat -d");
    

    【讨论】:

    • 谢谢,它成功了。现在我有一个新问题。如果用户关闭我的应用程序,整个应用程序进程将被销毁,但日志机器仍然在线。然后对process 对象的引用丢失了,重新打开活动后我无法停止流。你能帮帮我吗?
    • 其他问题。关闭这个并开始新的。不要忘记将我的答案标记为正确的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 2020-09-09
    • 1970-01-01
    相关资源
    最近更新 更多