У меня есть код для отображения значения RSSI подключенной сети. Фоновый процесс постоянно вызывает getRssi, а время цикла - несколько миллисекунд.Как долго wifi rssi берет андроид?
В цикле я отправляю значения обработчиком в поток пользовательского интерфейса, где я показываю текущее время вместе со скоростью цикла.
Однако дисплей пользовательского интерфейса обновляется каждые несколько секунд, тогда как скорость цикла составляет несколько миллисекунд. Почему расхождение?
package uk.co.moonsit.apps.wifi;
import uk.co.moonsit.apps.sensors.R;
import android.app.Activity;
import android.content.Context;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.Handler;
import android.text.format.Time;
import android.view.View;
import android.widget.TextView;
public class WifiRssiActivity extends Activity {
private WifiManager wifi;
private Handler handler = new Handler();
// private String toastText;
private TextView tvStrength;
private TextView tvSpeed;
private TextView tvSSID;
private TextView tvTime;
private View view;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wifi_rssi);
tvStrength = (TextView) findViewById(R.id.textViewWifiRssi);
tvSpeed = (TextView) findViewById(R.id.textViewSpeed);
tvSSID = (TextView) findViewById(R.id.textViewSSID);
tvTime = (TextView) findViewById(R.id.textViewTime);
String service = Context.WIFI_SERVICE;
wifi = (WifiManager) getSystemService(service);
Thread thread = new Thread(null, doBackgroundThreadProcessing,
"Background");
thread.start();
view = this.getWindow().getDecorView();
view.setKeepScreenOn(true);
}
private Runnable doBackgroundThreadProcessing = new Runnable() {
public void run() {
backgroundThreadProcessing();
}
};
private boolean isRunning = true;
// Method which does some processing in the background.
private void backgroundThreadProcessing() {
long mark = System.currentTimeMillis();
while (isRunning) {
int strength = 0;
int speed = 0;
String units = null;
String ssid = null;
long ms = 0;
WifiInfo info = wifi.getConnectionInfo();
if (info.getBSSID() != null) {
strength = WifiManager
.calculateSignalLevel(info.getRssi(), 100);
speed = info.getLinkSpeed();
units = WifiInfo.LINK_SPEED_UNITS;
ssid = info.getSSID();
}
long now = System.currentTimeMillis();
ms = now - mark;
mark = now;
GUIRunnable doUpdateGUI = new GUIRunnable(strength, speed, units,
ssid, ms);
handler.post(doUpdateGUI);
}
}
public class GUIRunnable implements Runnable {
private int strength;
private int speed;
private String units;
private String ssid = null;
private long ms;
public GUIRunnable(int st, int sp, String u, String ss, long m) {
strength = st;
speed = sp;
units = u;
ssid = ss;
ms = m;
}
public void run() {
updateGUI(strength, speed, units, ssid, ms);
}
}
private void updateGUI(int strength, int speed, String units, String ssid,
long ms) {
Time today = new Time(Time.getCurrentTimezone());
today.setToNow();
String millis = String.valueOf(System.currentTimeMillis());
String time = today.format("%k:%M:%S.")
+ millis.substring(millis.length() - 3);
tvStrength.setText("" + strength);
tvTime.setText(time + " - " + ms);
if (speed > 0)
tvSpeed.setText("" + speed + units);
if (ssid == null || ssid.length() == 0)
tvSSID.setText("No wifi connection");
else
tvSSID.setText(ssid);
// Toast.makeText(getApplicationContext(), toastText, Toast.LENGTH_LONG)
// .show();
}
@Override
protected void onResume() {
super.onResume();
isRunning = true;
}
@Override
protected void onPause() {
super.onPause();
// ssid = null;
isRunning = false;
}
}
Спасибо, я постараюсь вещательный приемник. – PerceptualRobotics
Любая идея, почему обновление времени происходит каждые несколько секунд, хотя хотя пост обработчика вызывается с той же скоростью, что и цикл? – PerceptualRobotics
Да - это в значительной степени то, что объясняет мой ответ. Скажем, андроид обновляет RSSI каждые 2 секунды. Даже если вы вызываете обработчик 500 раз в секунду, значение RSSI будет меняться каждые две секунды. Обработчик никоим образом не влияет на частоту измерения RSSI. – iheanyi