IT在线教育平台———麦子学院:http://www.maiziedu.com
30.
31. 33.
38. 39. android:background=\40. 41. android:layout_height=\利用setDataPosition读取多个值\ 42. 复制代码 2、配置文件如下: 1. 2. 3. 4. 5. 6. 7. 8. 9. package=\ android:versionCode=\ android:versionName=\ xmlns:android=\ android:label=\ android:name=\ 10. android:name=\ 11. IT在线教育平台———麦子学院:http://www.maiziedu.com 12. 13. 3、程序主文件如下: 1. 2. 3. 4. 5. 6. 7. 8. 9. private static String TAG = \ // Button ID private static int[] btIds = new int[] { R.id.btWriteByte, R.id.btReadDouble, R.id.btWriteString, R.id.btReadByte, R.id.btReadInt, R.id.btReadDouble, R.id.btReadString, R.id.btSameType }; // 每种类型的当前值 Activity implements OnClickListener { R.id.btWriteInt, 10. private byte cur_byte = 1; // 每次总写入 false 11. private int cur_int = 10; // 写入值 cur_int ++ ; 12. private double cur_float = 100.0d; // 写入值 cur_float++ ; 13. private String cur_str = \写入值 \->\ 14. 15. private Parcel parcel = null; 16. 17. @Override 18. public void onCreate(Bundle savedInstanceState) { 19. super.onCreate(savedInstanceState); 20. setContentView(R.layout.main); 21. for (int i = 0; i < btIds.length; i++) { 22. Button bt = (Button) findViewById(btIds[i]); 23. bt.setOnClickListener(this); 24. } 25. parcel = Parcel.obtain(); // 获得一个Parcel对象 ,相当于new一个,初始大小为0 26. Log.i(TAG, \27. } 28. 29. @Override IT在线教育平台———麦子学院:http://www.maiziedu.com 30. public void onClick(View view) { 31. // TODO Auto-generated method stub 32. int viewviewId = view.getId(); 33. switch (viewId) { 34. case R.id.btWriteByte: 35. parcel.setDataPosition(0); 36. parcel.writeByte(cur_byte); 37. Log.i(TAG, \38. break; 39. case R.id.btWriteInt: 40. parcel.writeInt(cur_int); 41. Log.i(TAG, \42. break; 43. case R.id.btWriteDouble: 44. parcel.writeDouble(cur_float); 45. Log.i(TAG, \46. break; 47. case R.id.btWriteString: 48. parcel.writeString(cur_str); 49. Log.i(TAG, \50. break; 51. case R.id.btReadByte: 52. byte b = parcel.readByte(); 53. Log.i(TAG, \54. + \55. break; 56. case R.id.btReadInt: 57. int i = parcel.readInt(); 58. Log.i(TAG, \59. break; 60. case R.id.btReadDouble: 61. float f = parcel.readFloat(); 62. readSameType(); 63. Log.i(TAG, \64. break; 65. case R.id.btReadString: 66. parcel.setDataPosition(0); 67. String str = parcel.readString(); IT在线教育平台———麦子学院:http://www.maiziedu.com 68. Log.i(TAG, \getParcelInfo()); 69. break; 70. case R.id.btSameType: 71. readSameType(); 72. break; 73. default: 74. break; 75. } 76. } 77. 78. private String getParcelInfo() {// 得到parcel的信息 79. return \80. + parcel.dataCapacity() + \81. + parcel.dataPosition(); 82. } 83. 84. /** 85. * 前提条件,Parcel存在多个类型相同的对象,本例子以10个float对象说明: 86. */ 87. public void readSameType() { 88. 89. for (int i = 0; i < 10; i++) { 90. parcel.writeDouble(i); 91. Log.i(TAG, \92. } 93. //方法一 ,显示设置偏移量 94. int i = 0; 95. int datasize = parcel.dataSize(); 96. while (i < datasize) { 97. parcel.setDataPosition(i); 98. double fvalue = parcel.readDouble(); 99. Log.i(TAG, \getParcelInfo()); 100. i += 8; // double占用字节为 8byte 101. } IT在线教育平台———麦子学院:http://www.maiziedu.com 102. // 方法二,由于对象的类型一致,我们可以直接利用readXXX()读取值会产生偏移量 103. // parcel.setDataPosition(0) ; // 104. // while(parcel.dataPosition() 106. // Log.i(TAG, \getParcelInfo()); 107. // } 108. } 由于取值时,可能存在类型的转换,因此点击按钮时,可能不会产生预期结果。因此,得保证偏移量对应数值的正确性。 如需了解更多相关知识,请至麦子学院官网查询(http://www.maiziedu.com/)。