我正在努力获得附近各种接入点的信号强度。
我的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()
函数吗?
答案 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
,我也会支持此选项。