使用上下文和执行程序服务(Android Wi-Fi)

时间:2014-08-07 13:51:34

标签: java android singleton android-wifi runnable

我正在努力获得附近各种接入点的信号强度。

我的scanWifi()函数正在单独的类中执行大部分处理。因此,我需要使用Context作为此函数的参数。

WiFi class

public class Wifi {

    public void scanWifi(Context context, String APName, ArrayList<Integer> accessPointMeanRSSArrayList, ArrayList<Integer> accessPointRSSFrequencyArrayList) throws Exception {

        ArrayList<Integer> tempRSSArrayList = new ArrayList<Integer>();
        boolean AP_found = false;

        WifiManager myWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);

目前我在Main Activity

中实现如下
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();

    Runnable periodicTask = new Runnable() {
        public void run() {
            Wifi wifiObject = new Wifi();
            // For each AP in the database, we will fill the AP's ArrayList with their corresponding RSS values
            for (Map.Entry<String, String> entry : AccessPoints.entrySet()){
                int APNoToBeSent = 0;

                try {
                    wifiObject.scanWifi(getApplicationContext(), entry.getKey(), accessPointMeanRSSArrayList, accessPointRSSFrequencyArrayList);
                }

                catch(Exception e) {
                }

                ++APNoToBeSent;
            }


            System.out.println("Mean AP0 = " + accessPointMeanRSSArrayList.get(0));
            System.out.println("Frqcy AP0 = " + accessPointRSSFrequencyArrayList.get(0));
        }
    };

    executor.scheduleAtFixedRate(periodicTask, 0, 2, TimeUnit.SECONDS);

我不确定我是否正确使用getApplicationContext(),因为我已经阅读了使用Singletons的人,并且还听说使用getApplicationContext()不正确的方法也没有使用Singletons

所有这些让我有点困惑,在这个例子中最佳做法是什么。我应该以不同的方式将Context传递给我的scanWifi()函数吗?

1 个答案:

答案 0 :(得分:2)

你没有一个你每两秒创建一个单身的单身。

我将上下文传递给构造函数,而不是方法:

public class Wifi {

    private final WifiManager wifiManager;

    public Wifi(Context context){
        wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    }

    public void scanWifi(String APName, ArrayList<Integer> accessPointMeanRSSArrayList, ArrayList<Integer> accessPointRSSFrequencyArrayList) throws Exception {

        ArrayList<Integer> tempRSSArrayList = new ArrayList<Integer>();
        boolean AP_found = false;

从runnable内部创建如下:

Wifi wifiObject = new Wifi(Activity.this);

<强>替代:

public class Wifi {

    private final WifiManager wifiManager;

    public Wifi(WifiManager wifiManager){
        this.wifiManager = wifiManager;
    }

像这样创建:

 Wifi wifiObject = new Wifi((WifiManager) getSystemService(Context.WIFI_SERVICE));

这在某种程度上是一个问题或个人偏好。

第一个选项:Context在Android中很容易获得。这种方法隐藏了你需要使用的代码来获取wifi服务,这使得记忆如何使用它变得更加简单。

然而,第二个选项具有最小的依赖性(较少的import语句)。如果context不是那么普遍存在,或者我已经提到了准备通过的wifi服务,我可能会选择第二种选择。如果有多种方法可以访问WifiManager,我也会支持此选项。