【强势回归,Android开发疑难杂症】Process 和 ProcessBuilder 区别
时间:2022-04-26
本文章向大家介绍【强势回归,Android开发疑难杂症】Process 和 ProcessBuilder 区别,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
前段时间在开发Android项目当中,发现需要更改文件权限,所以接触了Linux的一些文件权限问题。
Android系统中,在data/data/包名/ 这个路径下的文件是只有可写可读的权限,但是没有可执行的权限。
(关于权限的问题可以百度一下查看这方面的技术点)
下面是我项目中所使用到有关于更改文件权限的代码
第一段是我原本所使用的,原理上是没有什么问题。
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 }
但是就是在调用到这段代码的时候,我发现我要准备修改权限的文件总是不能成功修改权限。
可是断点调试的时候,这段代码都有被执行到。
奇怪的是,有时候可以成功,有时候不可以成功?!这个才是问题的关键。
........
后来在@祝福大神的帮助下,总算是解决了这个问题
改完之后代码是这样的:
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封装好了的线程类,使用这些的话,可以有效减少因为线程而产生异常。
虽然是已经封装好了线程类,但是也尽量采用单例模式实例化线程或线程的实例来执行任务。
- 百度地图之收索视野内的建筑物
- Line Counter - Writing a Visual Studio 2005 Add-In
- 百度地图之标注聚会
- How to Add an API to your Web Service
- 「微信小程序」剖析(四):原生的实时DOM转Virtual DOM
- 让你的「微信小程序」运行在Chrome浏览器上,让我们使用WebStorm
- android上拉下拉加载更多数据
- 「微信小程序」剖析(二):框架原理 | 在桌面浏览器上运行的尝试
- Working with Windows Workflow Foundation in ASP.NET
- 微信小程序剖析【下】:运行机制
- android多屏幕分辨率适配
- 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](二)
- 怎么解决web service circular reference 问题
- android使用LruCache对listview加载图片时候优化处理
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Docker安全之用户资源隔离
- kubernetes(六) 基于kubeadm构建高可用k8s集群
- docker存储驱动知识归纳总结
- 未来已来——如何在VR游戏中实现3D语音
- kubernetes(五)之Dockerfile
- kubernetes(四)之Docker存储卷
- 使用卷积神经网络构建图像分类模型检测肺炎
- 如何提升docker容器安全性
- CICD(三)Ansible常用模块以及案例
- 深入SVM:支持向量机核的作用是什么
- kubernetes(三)之Docker网络详解
- kubernetes(二)之Docker容器及镜像
- 反向传播算法:定义,概念,可视化
- Go语言(二十一) 常见的模块使用
- kubernetes(一)之Docker基础入门