java - Android缓存影响变量的值?
问题描述
我在 Android 应用程序中使用下面的代码。在某些手机中,代码可以按预期正常工作。在其他情况下,变量会意外更改其值。
一些测试中的 LogCat 示例:
03-27 13:38:59.628 17735-17735/? I/System.out: my_var=1.0
03-27 13:38:59.651 17735-17740/? I/zygote: Do partial code cache collection, code=448KB, data=496KB
03-27 13:38:59.652 17735-17740/? I/zygote: After code cache collection, code=446KB, data=495KB
Increasing code cache capacity to 2MB
03-27 13:38:59.693 17735-17735/? I/System.out: my_var=0.0
编辑:我试图创建一个显示意外行为的最小方法;在这种情况下, my_var 在我之前指出的循环之外更改值;在这些测试中我看不到 zygote 消息;但是,我认为意外行为可能与缓存的更改有关。意外行为仅发生在某些手机中(~6 英寸手机 LGE LG-Q710AL Android 8.1.0 API 27)。谢谢你的时间。任何帮助将不胜感激。
public double[] my_method(double[] array, String my_string) {
/*
Example of LogCat:
(exit 1) my_var=1.0
(exit 2) my_var=1.0
(exit 3) my_var=1.0
(exit 4) my_var=0.0 <=== SHOULD BE 1.0
*/
for (int i=0; i<2500; i++) //example of input_array.
array[i]=66.4079;
my_string="string_1"; //example of input_string.
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
int result = -1;
int max = 1;
int count=0;
double number_8=0;
int number_of_items=array.length;
int[] array_of_items_multiplied = new int[number_of_items];
double my_var=10;
if ( my_string.equals("string_1") )
my_var=1; //selected case
else if ( my_string.equals("string_2") )
my_var=100;
double [] other_array = new double[100];
double number_1 = number_of_items/100.0;
int number_2=0;
double number_3=0;
int number_4=0;
boolean bool_1=false;
double number_5= ( my_string.equals("string_1") ) ? 66.4079 : 0;
int number_6=0;
double auxVar_array_i=0;
for (int i=0; i<number_of_items; i++) {
array_of_items_multiplied[i]=(int)Math.round(array[i]*my_var);
if ( i >= (int)(number_2*number_1)
&&
i < (int)((number_2+1)*number_1)
)
{
if ( bool_1==false
&& auxVar_array_i!=number_5
)
{
number_6++;
if (number_6>23)
bool_1=true;
}
number_3+=auxVar_array_i;
number_4++;
}
else {
if (number_4!=0)
other_array[number_2]=(number_3/number_4);
else {
other_array[number_2]=(number_3);
}
number_3=auxVar_array_i;
number_4=1;
number_2++;
if (number_2>99) {
number_2=99;
}
}
}
System.out.println("(exit 1) my_var="+my_var);
if (number_4!=0)
other_array[number_2]=(number_3/number_4);
else {
other_array[number_2]=(number_3);
}
System.out.println("(exit 2) my_var="+my_var);
for (int arrayItem : array_of_items_multiplied) {
if (map.get(arrayItem) != null) {
count = map.get(arrayItem);
count++;
map.put(arrayItem, count);
if (count > max) {
max = count;
result = arrayItem;
}
}
else
map.put(arrayItem, 1);
}
System.out.println("(exit 3) my_var="+my_var);
for (double number_7: other_array)
number_8+=number_7;
number_8=number_8/100.0;
System.out.println("(exit 4) my_var="+my_var);
double number_9=(double)result;
double number_10=0;
if (result==-1 && max==1) {
number_9=number_8*my_var;
number_10=1;
}
double[] another_array=new double[102];
another_array[0]=(number_9/my_var);
another_array[1]=number_10;
System.arraycopy(other_array, 0, another_array, 2, 100);
return another_array;
}
解决方案
推荐阅读
- php - 使用 PutFileAS() laravel 将文件存储在存储文件夹中
- laravel - Laravel api 版本控制 - 如何处理版本之间的共享功能?
- iphone - 由于在应用程序中订阅,应用程序被 App Store 拒绝
- elixir - 酿酒厂失败并显示消息“多重定义模块:'Elixir.Telemetry'”
- pyspark - Pyspark 命令移动到新行
- pic - 来自定时器输出的 PIC I2C 时钟
- android - RTC_WAKEUP 和 BroadcastReceiver 的警报以拦截打盹模式
- java - 为什么 servlet 的 init() 方法在不同的线程中运行?
- zend-framework3 - 如何在 Doctrine Zend Framework 3 中添加分页
- html - 动画完成后绝对定位的元素移动