在run方法中使用static成员变量问题
2016-08-03 16:21
302 查看
最近在写一个蓝牙的测试程序,里面定义了一个CommunicateThread 连接线程类继承于Thread;在该类中定义了一个run方法。run方法代码如下:
本人的目的就是想通过其他类设置一个static成员变量来控制while()里面的循环标志位。无论我用什么方法都不能控制这个标志位;即在Communication类中的这个标志位与我一开始定义的那个标志有差别。这就是我要写这篇博客的原因了。
通常,static成员变量在创建时只分配一次内存,它作用于全局范围,由类名直接调用。当我把static标志位在一个Fragment定义后,然后在while()里面调用Fragment.标志位;发现结果与我想象中的不一样。但在fragment里面该值已经变化了;也就是说run方法中这个值与Fragment中的值不同时变化。这就与我们所理解的static只分配一次内存的想法背向而驰。这期间我也在网上查找了一些资料,然而并没有查到什么结果。我们只能猜测在run方法中,该标志位被重新拷贝了一份。
当然,出现这样的问题也是因为我在写程序想偷懒,或许我的想法比较奇特。正常的写法应该是在Communication类中定义一个Close()方法,在close()方法中令isRunning设置为false。然后在实例化Communication类的类中再调用Close()方法;这样就能控制标志位了。
如果有知道导致该问题原因的大牛们,请留言告知,非常感谢了!
另附上正常写法:public void close() {
if (mCommunicateThread != null) {
mCommunicateThread.close();
}
try {
if (mBluetoothSocket != null) {
mBluetoothSocket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
} 这个close()方法是在Communication类实例化类中的方法。通过调用该方法就能控制了!
public void run() { byte[] buffer;//用于读数据的缓存区 int size;//长度 String data;//数据 while (isRunning && isOverCount) { try { //System.out.println("isOverTime:"+" "+isOverTime); if (in != null) { size = in.available(); //有数据就去拿出来 if (size > 0) { buffer = new byte[size]; in.read(buffer); data = new String(buffer); //能过Handler把数据传出去 Message msg = mHandler.obtainMessage(); msg.what = BluetoothConstant.WHAT_RECEIVED_DATA; msg.obj = data; mHandler.sendMessage(msg); } } } catch (IOException e) { //e.printStackTrace(); isRunning = false; System.out.println("Error-CommunicateThread:run()"); } } }
本人的目的就是想通过其他类设置一个static成员变量来控制while()里面的循环标志位。无论我用什么方法都不能控制这个标志位;即在Communication类中的这个标志位与我一开始定义的那个标志有差别。这就是我要写这篇博客的原因了。
通常,static成员变量在创建时只分配一次内存,它作用于全局范围,由类名直接调用。当我把static标志位在一个Fragment定义后,然后在while()里面调用Fragment.标志位;发现结果与我想象中的不一样。但在fragment里面该值已经变化了;也就是说run方法中这个值与Fragment中的值不同时变化。这就与我们所理解的static只分配一次内存的想法背向而驰。这期间我也在网上查找了一些资料,然而并没有查到什么结果。我们只能猜测在run方法中,该标志位被重新拷贝了一份。
当然,出现这样的问题也是因为我在写程序想偷懒,或许我的想法比较奇特。正常的写法应该是在Communication类中定义一个Close()方法,在close()方法中令isRunning设置为false。然后在实例化Communication类的类中再调用Close()方法;这样就能控制标志位了。
如果有知道导致该问题原因的大牛们,请留言告知,非常感谢了!
另附上正常写法:public void close() {
if (mCommunicateThread != null) {
mCommunicateThread.close();
}
try {
if (mBluetoothSocket != null) {
mBluetoothSocket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
} 这个close()方法是在Communication类实例化类中的方法。通过调用该方法就能控制了!
相关文章推荐
- 使用Apache Axis部署 Web服务时的常见问题及其解决方法
- 使用java mail 包收发中文邮件的编码,解码问题以及解决方法
- 在JBossPortal中使用MySQL5出现数据截断问题的解决方法
- 使用JasperReports合并多个报表的word文档问题解决方法
- 安装完vs.2005之后,重新安装iis后无法使用http方式访问asp.net工程的页面的问题的解决方法
- JSP数据和JavaScirpt数据交互使用问题的一种解决方法
- [开发手记].NET Remoting 使用中的问题之静态方法
- [ChneChen的随笔][管理之道]什么才是我们需要的解决问题的方法(从如何限制公司电脑使用U盘解决之道谈起)
- 使用Axis部署Web服务时的常见问题及其解决方法(转)
- [Nebula2]使用3dmax7,nmaxtoolbox导出模型到nebula2遇到的问题及解决方法
- Java使用Oracle遇到的最大游标超出问题及其解决方法
- Struts使用中ActionForm get set方法的小问题
- 第一次使用jdbc连接postgre数据库碰到的问题及解决方法
- Firefox 使用常见问题和解决方法
- 使用Apache Axis部署 Web服务时的常见问题及其解决方法
- 红旗桌面4.0正式版最新使用方法和问题解答100例
- 关于使用VS.Net2003调试器出现的问题及相关解决方法 (转)
- 使用Apache Axis部署 Web服务时的常见问题及其解决方法(转)
- 使用webservice解决多系统登陆问题(方法一)
- Infragistics的NetAdvantage控件使用中遇到的问题及解决方法