PhoneStateListener onSignalStrengthsChanged ArrayList中的平均ASU值

时间:2014-06-02 08:29:33

标签: java android arraylist

我希望得到以下问题的帮助。基本上,我正在尝试收集从ASU方法返回的每个onSignalStrengthsChanged()结果,并将每个ASU值放在ArrayList内,以便可以计算平均ASU值。我尝试了很多不同的方法,却无法得到正确的结果。似乎ArrayList只存储一个ASU值(即当前值)并覆盖先前的ASU值。很感谢任何形式的帮助。我尝试的代码如下;

private class SignalListener extends PhoneStateListener {
    @Override
    public void onSignalStrengthsChanged(SignalStrength signalStrength) {       

        Double strengthAmplitude = signalStrength.getGsmSignalStrength();

        ArrayList <Double> arrayList = new ArrayList<Double>();

        while (arrayList.size() <= 5) { //limit array list collection to 6 elements/ASU values 
            arrayList.add(strengthAmplitude);
        }

        for (int i = 0; i < arrayList.size(); i++)
            int item = arrayList.get(i);

        if (arrayList.size() == 0)  
        {  
            System.out.println("Warning!  Average can not be calculated");  
        }   
        else  
        {  
            double total = 0;  
            for (double element : arrayList)  
            {  
                total = total + element;  
            }  
            double average = total / arrayList.size();  
            System.out.println("Average ASU value over sample: " + average);  
        }  

        super.onSignalStrengthsChanged(signalStrength);
    }
}

2 个答案:

答案 0 :(得分:0)

你的问题在于范围界定。每次输入此函数时,您都在创建一个新的数组列表。你没有重用旧的。这意味着你永远不会超过1个值。而且,你的循环很奇怪。

答案 1 :(得分:0)

几点要考虑:

  • 将您的ASU值保存在onSignalStrengthsChanged()外部声明的ArrayList中 - 正如Gabe所提到的,您每次都在创建新的ArrayList&#39; onSignal ..&#39;触发,所以你的arrayList包含一个项目;将arrayList移到onSignalStrengthsChanged()之外,这样,您就可以将ASU读数添加到您的成员变量arrayList中,并且您将能够计算平均值

  • 重点:

    for(int i=0; i<arrayList.size(); i++) 
        int item = arrayList.get(i);
    

    ???

  • 在Android中,建议使用Log方法代替&#39; System.out&#39;