Pergunta

Eu tenho uma aula de wifi que tem alguns receptores de transmissão que ouvem mudanças no estado de conexão wifi, níveis de wifi rssi etc ...

Quero poder passar esses dados para outro objeto "mecanismo" e ainda manter os dados alterando dinamicamente.

Atualmente, crio um objeto WiFi na classe "mecanismo" e execute seus métodos, os dados são exibidos dinamicamente bem em instruções de log no Log Cat.

Meu problema é tentar obter os dados alterações dinamicamente para o mecanismo, quando tento obter dados sobre o primeiro valor e o deixa assim sem nunca atualizar.

Então, eu queria saber quais são minhas opções sobre como fazer isso?

Abaixo está minha configuração atual de código, se isso for alguma ajuda:

Classe Wi -Fi

public Wifi(Context context){

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

}

public int getCurrentWifiState() {
    return currentWifiState;
}

public void setCurrentWifiState(int currentWifiState) {
    this.currentWifiState = currentWifiState;
}

public String getConnectedSSID() {
    return connectedSSID;
}

public void setConnectedSSID(String connectedSSID) {
    this.connectedSSID = connectedSSID;
}

public int getConnectedLevel() {
    return connectedLevel;
}

public void setConnectedLevel(int connectedLevel) {
    this.connectedLevel = connectedLevel;
}

//method to do a scan and receive info about all access points available
public List<ScanResult> scan(final Context context){

               receiverWifi = new WifiReceiver();
               mainWifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);

               context.registerReceiver(receiverWifi, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
               mainWifi.startScan();
               Log.d("WIFI DEBUG","\nStarting Scan...\n"); 
               wifiList = mainWifi.getScanResults();

    return wifiList; 
}

 class WifiReceiver extends BroadcastReceiver {
     public void onReceive(Context c, Intent intent) {
          sb = new StringBuilder();
          wifiList = mainWifi.getScanResults();
          ListIterator<ScanResult> results = wifiList.listIterator();

          while (results.hasNext()) {
              ScanResult info = results.next();
              String wifiInfo = "Name: " + info.SSID + "; capabilities = " + info.capabilities + "; sig str = " + info.level + "dBm";
              Log.v("WiFi", wifiInfo);
              Log.d("Signal Level", "Signal Level : " + mainWifi.calculateSignalLevel(info.level, 5));

          }
     }
 }

 //method to listen for changes in the level of the wifi connection
 public void initializeWiFiListener(Context context){
        Log.d("WIFI", "executing initializeWiFiListener");

        String connectivity_context = Context.WIFI_SERVICE;
        final WifiManager wifi = (WifiManager)context.getSystemService(connectivity_context);

        if(!wifi.isWifiEnabled()){
                if(wifi.getWifiState() != WifiManager.WIFI_STATE_ENABLING){
                        //wifi.setWifiEnabled(true);
                }
        }
        rssiListener = new BroadcastReceiver(){

                @Override
                public void onReceive(Context context, Intent intent) {
                        String action = intent.getAction();

                        if(WifiManager.RSSI_CHANGED_ACTION.equals(action)){
                            WifiInfo data = mainWifi.getConnectionInfo();
                            Log.d("WIFI", "RSSI has changed");
                            if(mainWifi.getConnectionInfo()!=null){
                            setConnectedSSID(data.getSSID());
                            setConnectedLevel(data.getRssi());
                            Log.d("WIFI", "new RSSI = " + data.getSSID()+ " " + data.getRssi() + "dBm");
                            }
                        }      
                }
        };
        //leak here - need to de reg receiver
        context.registerReceiver(rssiListener, new IntentFilter(WifiManager.RSSI_CHANGED_ACTION));
}

 //method to listen for changes in the connection to a wifi access point
 public void changeWiFiListener(Context context){
        Log.d("WIFI", "executing initializeWiFiListener");

        String connectivity_context = Context.WIFI_SERVICE;
        final WifiManager wifi = (WifiManager)context.getSystemService(connectivity_context);

        if(!wifi.isWifiEnabled()){
                if(wifi.getWifiState() != WifiManager.WIFI_STATE_ENABLING){
                        //wifi.setWifiEnabled(true);
                }
        }
        wifiChangeListener = new BroadcastReceiver(){

                @Override
                public void onReceive(Context context, Intent intent) {
                        String action = intent.getAction();

                        if(WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)){

                            Log.d("WIFI", "WIFI has changed");
                            int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, -1);
                            Log.d("WIFI", "WIFI State = " + wifiState);
                            setCurrentWifiState(wifiState);

                        }  
                }
        };
        //Leak here - not unregistering receiver
        context.registerReceiver(wifiChangeListener, new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION));
}

public WifiReceiver getReceiverWifi() {
    return receiverWifi;
}

public void setReceiverWifi(WifiReceiver receiverWifi) {
    this.receiverWifi = receiverWifi;

E meu código do motor:

public Engine(Context aContext){

        context = aContext;

        cm = new CallManager(aContext);

        wifiManager = new Wifi(context);
        wifiManager.initializeWiFiListener(context);
        wifiManager.changeWiFiListener(context);    

        clc = new CallLogController();
    }

    public void controlCalls(){

        int currentWifiState = wifiManager.getCurrentWifiState();
        cm.monitorOutgoingCalls(context, currentWifiState, clc);

    }

    public void unRegAllRecievers(){

        wifiManager.unregRegisters(context);
        cm.unRegReciever(context);

    }

    public void doWifiScan(){

        scanTask = new TimerTask() {
            public void run() {
                    handler.post(new Runnable() {
                            public void run() {
                                wifiManager.scan(context); 
                                Log.d("TIMER", "Timer set off");
                            }
                   });
            }};

        t.schedule(scanTask, 300, 30000);
    }

    public void stopScan(){ 

            scanTask.cancel();
            t.cancel();
            //boolean tf = scanTask.cancel();
            //Log.d("TIMER", "Timer True or False? : " + tf);
    }
}

Então, estou me perguntando qual seria a melhor solução para garantir que os dados da classe WiFi sejam constantemente atualizados no mecanismo quando receber alterações do receptor de transmissão?

Foi útil?

Solução

Depende se a sua classe, a que deve ser notificada do estado mais recente. Se for uma classe que não é criada em uma atividade e é estática (singletone ou aplicativo), provavelmente deve atualizar o Reciver a classe singletone.

Se for baseado em atividades, você precisa de transmissões de stick e, uma vez que a transmissão seja recebida, remova a transmissão pegajosa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top