大家看一下 我这么在Android 中使用byte是否有隐患

lishi_1991 2014-10-15 02:40:18
我一直做c开发的,所以比较在意内存的申请和释放
但是在Android开发中一般不考虑释放问题,所以在使用的时候总会觉得有些隐患,希望专业Android开发人员帮我解答一下,谢谢!
现在我写了一个接口函数 函数大致功能是对接收到的十六进制byte[]进行解析,解析过程需要使用一个中间byte[]变量做相关处理;
并且这个解析函数是要循环执行无数次(从程序运行一直循环到程序退出);
而我在这个函数中像这样
byte[] buf_byte = new byte[30];
,每次执行这个函数都申请一个byte变量,那么程序一直跑会不会出问题,比如内存满了之类的;
我之前的解决方法是申请一个全局byte变量,传给这个函数做处理,但是觉得应该了解明白java的机制,所以向大家请教一下;
...全文
308 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_35828013 2016-08-09
  • 打赏
  • 举报
回复
引用 1 楼 birdsaction 的回复:

  用这个类可以减少你的工作
	ByteBuffer buffer = ByteBuffer.allocate(30); //初始化30个长度的空间
		buffer.put((byte)0x10); //添加一个byte,,后面都一样,,,,,
		buffer.put((byte)0x19);
		////
		
		buffer.flip();//必须执行,为读取数据做准备
		byte[] data = buffer.array();// 获取所有数据 就是30个字节的数组了 ,

你只申请了30的byte 一般很难内存变满,在JAVA里面一般不容易出现。
版主你好。我这样的话 buffer.put((byte)0xa5); 出错了。遇到这种超过了128的数据,怎么解决赋值问题?
lishi_1991 2014-10-21
  • 打赏
  • 举报
回复
引用 3 楼 sirius93 的回复:
没有什么隐患,只是可能有效率问题,java是块作用域,脱离语句块的变量就随时可能被虚拟机销毁 比如

public String test(){
   String a;
   while(true){
     String b;
  }
  String c;
  return c;
}
1.String a的作用域在test()中,调用完test()后a就变成可回收的变量 2.String b的作用域在while中,每执行一次循环后,本次循环产生的b就变成可回收的变量 3.String c的作用域在test()中,但是其同时也被作为返回值,系统会产生一份c的副本并将此副本返回,同时方法中的c也变成了可回收的变量 只有像BItmap的decodeStream()这种实际是调用c执行的代码才需要注意内存的释放
谢谢你的讲解最详细,有些明白了 java中变量生存的时间问题
Hare_ 2014-10-20
  • 打赏
  • 举报
回复
内存申请放在循环里,循环频率过高的话会影响效率,申请全局的,用完之后将数据清除,下次接着使用!
caihjiang1 2014-10-20
  • 打赏
  • 举报
回复
分配大于1.5G的内存,必须是64位系和和开发64位应用程序才支持,我试过使用vc分配12G的内存也成功
coffee-time 2014-10-15
  • 打赏
  • 举报
回复
没有什么隐患,只是可能有效率问题,java是块作用域,脱离语句块的变量就随时可能被虚拟机销毁 比如

public String test(){
   String a;
   while(true){
     String b;
  }
  String c;
  return c;
}
1.String a的作用域在test()中,调用完test()后a就变成可回收的变量 2.String b的作用域在while中,每执行一次循环后,本次循环产生的b就变成可回收的变量 3.String c的作用域在test()中,但是其同时也被作为返回值,系统会产生一份c的副本并将此副本返回,同时方法中的c也变成了可回收的变量 只有像BItmap的decodeStream()这种实际是调用c执行的代码才需要注意内存的释放
svenwang 2014-10-15
  • 打赏
  • 举报
回复
内存用完倒不会,就是会影响一些效率。 如果函数执行频率高的话,还是有必要优化一下,也就是说重复使用中间缓冲区。
Birds2018 2014-10-15
  • 打赏
  • 举报
回复

  用这个类可以减少你的工作
	ByteBuffer buffer = ByteBuffer.allocate(30); //初始化30个长度的空间
		buffer.put((byte)0x10); //添加一个byte,,后面都一样,,,,,
		buffer.put((byte)0x19);
		////
		
		buffer.flip();//必须执行,为读取数据做准备
		byte[] data = buffer.array();// 获取所有数据 就是30个字节的数组了 ,

你只申请了30的byte 一般很难内存变满,在JAVA里面一般不容易出现。

80,337

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧