java - Android 正确关闭进程

标签 java android

我正在使用这些代码在我的 Android 应用程序上运行屏幕截图功能,它能够捕获屏幕截图并将其转换为要使用的位图,但是在运行几次之后。应用程序变得更慢,我不知道为什么

是否是由于这些代码连续运行并在内存中留下进程造成的?如果是这样,我该如何正确关闭它们?

Process process = Runtime.getRuntime().exec("su");
OutputStreamWriter outputStream = new OutputStreamWriter(process.getOutputStream());
outputStream.write("/system/bin/screencap -p\n");
outputStream.flush();
Bitmap screen = BitmapFactory.decodeStream(process.getInputStream());
outputStream.write("exit\n");
outputStream.flush();
outputStream.close();

最佳答案

如果您使用的是 jdk 7,则可以使用 try-with-resources 方法:

Process process = Runtime.getRuntime().exec("su");
try (OutputStream out = process.getOutputStream();
     InputStream in = process.getInputStream()) {
    OutputStreamWriter outputStream = new OutputStreamWriter(out);
    outputStream.write("/system/bin/screencap -p\n");
    outputStream.flush();
    outputStream.write("exit\n");
    Bitmap screen = BitmapFactory.decodeStream(in);
}

通过将 InputStreamOutputStream 放在 try block 的括号中,两个流将在 try block 末尾自动关闭。

或者,您可以使用 Google Guava 库(顺便说一句,这非常棒)。如果您需要的话,我可以发布该代码,但它位于他们的网站上( https://github.com/google/guava/wiki/ClosingResourcesExplained )

关于java - Android 正确关闭进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36169064/

相关文章:

java - 工作灯 : Performance of calling java static method vs object creation

android - 播放videoView时仅在layout-land android中制作全屏

android - 显示具有多个航路点的两点之间的路线

java - volatile 和同步化解决竞争条件: Singleton Member Field

java - 如何使用 Java for Jenkins 使用 REST API 进行 POST

java - 从数组中随机选择元素,而不选择两次

Android onBackPressed/onUserLeaveHint

java - 如果我再次使其可用, "finalized"对象会发生什么情况?

java - 从 ArrayList 中删除具有相似值的对象

java - 从远程服务恢复的 ListView 和大型列表