首页 > 解决方案 > 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;
    }

标签: javaandroidcachingmemory

解决方案


推荐阅读