前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【强势回归,Android开发疑难杂症】Process 和 ProcessBuilder 区别

【强势回归,Android开发疑难杂症】Process 和 ProcessBuilder 区别

作者头像
非著名程序员
发布2018-02-01 15:28:39
1.9K0
发布2018-02-01 15:28:39
举报
文章被收录于专栏:非著名程序员非著名程序员

前段时间在开发Android项目当中,发现需要更改文件权限,所以接触了Linux的一些文件权限问题。

Android系统中,在data/data/包名/ 这个路径下的文件是只有可写可读的权限,但是没有可执行的权限。

(关于权限的问题可以百度一下查看这方面的技术点)

下面是我项目中所使用到有关于更改文件权限的代码

第一段是我原本所使用的,原理上是没有什么问题。

代码语言:js
复制
1 /**
2 *  修改文件权限
3 * @param file
4 */
5 public static void chmod(File file){
6     try {
7        String command = "chmod 777 " +file.getAbsolutePath();
8        Runtime runtime = Runtime.getRuntime();
9        Process process = runtime.exec(command);
10         process.destroy();
11     } catch (Throwable e) {
12        e.printStackTrace();
13     }
14 }

但是就是在调用到这段代码的时候,我发现我要准备修改权限的文件总是不能成功修改权限。

可是断点调试的时候,这段代码都有被执行到。

奇怪的是,有时候可以成功,有时候不可以成功?!这个才是问题的关键。

........

后来在@祝福大神的帮助下,总算是解决了这个问题

改完之后代码是这样的:

代码语言:js
复制
1 /**
2 *  修改文件权限
3 * @param file
4 */
5 public static void chmod(File file){
6      try { 
7         String[] command = {"chmod", "777",file.getPath()};  
8         ProcessBuilder builder = new ProcessBuilder(command); 
9         builder.start();  
10      } catch (IOException e) { 
11         e.printStackTrace();  
12      }
13 }

原来是,Process 创建一条新的线程去执行任务,但创建进程的方法可能无法针对某些本机平台上的特定进程很好地工作。

但是ProcessBuilder是一个final类,用于创建操作系统进程。每个ProcessBuilder实例管理一个进程属性集。

1)start() 方法利用这些属性创建一个新的 Process 实例。

2)start() 方法可以从同一实例重复调用,以利用相同的或相关的属性创建新的子进程

问题就是出现在这里,运行过程中Process 由于某种愿意导致无法正常更改文件权限。

一般来说,手机中资源有限,尽量少创建新的线程。

Handler、AsyncTask等等,这些都是Android封装好了的线程类,使用这些的话,可以有效减少因为线程而产生异常。

虽然是已经封装好了线程类,但是也尽量采用单例模式实例化线程或线程的实例来执行任务。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2014-12-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 非著名程序员 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档