Autore Topic: Dubbio Override  (Letto 1850 volte)

Offline asterix07

  • Nuovo arrivato
  • *
  • Post: 45
  • Respect: 0
    • Mostra profilo
Dubbio Override
« il: 16 Novembre 2010, 10:23:20 CET »
0
Facendo l'override del metodo onReceive, (relativo alla classe BroadcastReceiver) posso implementare un interfaccia? nel mio caso LocationListener?

Es.:
public void onReceive(Context context, Intent intent) implements LocationListener

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Dubbio Override
« Risposta #1 il: 16 Novembre 2010, 10:30:20 CET »
0
L'implements si fa a livello di classe non a livello di metodo.
Comunque non ti conviene inserirlo all'interno di un BroadcastReceiver perchè la sua durata è limitata all'esecuzione delle istruzioni contenute nell'onReceive e se non si conclude entro 10 secondi si ha la tipica schermata di ANR.

Offline asterix07

  • Nuovo arrivato
  • *
  • Post: 45
  • Respect: 0
    • Mostra profilo
Re:Dubbio Override
« Risposta #2 il: 16 Novembre 2010, 10:36:17 CET »
0
ok, grazie per le dritte, ne approfitto per  spiegarti cosa intendo fare. Io ho location manager sempre attivo. Dunque il GPS rimane sempre acceso. Ora io voglio attivare il location manager solo quando cambia lo stato WiFi, quindi pensavo di implementare LocationManager all'interno dell' override di onReceive.
(non so se sono stato chiaro)

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Dubbio Override
« Risposta #3 il: 16 Novembre 2010, 10:39:45 CET »
0
Io fossi in te userei il receiver per far partire/fermare un servizio che al suo interno contiene il LocationManager

Offline asterix07

  • Nuovo arrivato
  • *
  • Post: 45
  • Respect: 0
    • Mostra profilo
Re:Dubbio Override
« Risposta #4 il: 16 Novembre 2010, 10:47:44 CET »
0
Cioè intendi dire di attivare il location manager e poi gestirlo tramite receiver? (receiver non l ho mai usato)

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Dubbio Override
« Risposta #5 il: 16 Novembre 2010, 10:50:30 CET »
0
Scusa forse mi sono espresso male.
Metti in un Service tutta la logica di gestione della locazione (quindi il LocationListener o quello che ti serve).
Il BroadcastReceiver che riceve i cambiamenti di stato del gps ti serve per far partire (quando viene attivato il gps) o fermare (quando viene disattivato) il servizio di cui sopra.

Offline asterix07

  • Nuovo arrivato
  • *
  • Post: 45
  • Respect: 0
    • Mostra profilo
Re:Dubbio Override
« Risposta #6 il: 16 Novembre 2010, 11:20:54 CET »
0
ok ho capito cosa vuoi dire....in questo modo andrei pero a modificare troppo la struttura dell applicazione che invece deve rimanermi simile all originale.
Trascurando l'efficienza delle varie implementazione, la mia idea di attivare location manager all interno del metodo "ovverraidato" onReceive è fattibile? Io ho un activity che implementa un LocationListener, all'interno di questa viene creato  un BroadcastReceiver(usato per le variazioni di stato del Wifi e non del GPS), nel quale viene fatto l'verride del metodo onReceive. Ora il mio problema è che quando richiamo il metodo locationManager.requestLocationUpdates, non so cosa passargli come parametro per il LocationListener.

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Dubbio Override
« Risposta #7 il: 16 Novembre 2010, 11:33:52 CET »
0
Non avevi specificato che eri dentro un'activity, questo ovviamente cambia tutto.

Comunque dichiara come attributo della tua classe activity un oggetto che implementa LocationListener:
Codice (Java): [Seleziona]
private static final LocationListener locListener = new LocationListener(){ //implementazione dell'interfaccia };
e poi usi quell'oggetto quando chiami in requestLocationUpdates o il removeUpdates

PS: Tutto questo a occhio eh, non ci ho mai lavorato direttamente  ;)
« Ultima modifica: 16 Novembre 2010, 11:36:06 CET da Ricky` »

Offline asterix07

  • Nuovo arrivato
  • *
  • Post: 45
  • Respect: 0
    • Mostra profilo
Re:Dubbio Override
« Risposta #8 il: 16 Novembre 2010, 12:01:09 CET »
0
cioè in questo stralcio di codice dove verrebbe implementeresti l'interfaccia?
Codice (Java): [Seleziona]
import java.util.List;

//import com.google.android.maps.GeoPoint;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
//import android.database.sqlite.SQLiteDatabase;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.net.wifi.ScanResult;
//import android.net.wifi.WifiConfiguration;
//import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiManager.WifiLock;
import android.os.Bundle;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class StartLookForW extends Activity implements LocationListener {

        private WakeLock wakeLock = null;
        private static final Object CURRENT_LOCATION_LOCK = new Object();

        private WifiManager wifiManager = null;
        private WifiLock wifiLock = null;
        private static int prevWifiState = 1;
        private BroadcastReceiver wifiReceiver = null;

        private LocationManager locationManager = null;
        private Location curLocation = null;

        //.......................

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.stop);

                //.....................
                  .......................


                IntentFilter i = new IntentFilter();
                i.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
               
               
                       
               
                wifiReceiver = new BroadcastReceiver(){
                        @Override
                public void onReceive(Context context, Intent intent) {
                                /*
                                 * Code to execute when SCAN_RESULTS_AVAILABLE_ACTION event occurs
                                 */

                                Double lat = null, lon = null, alt = null;
                                long curTime = 0;
                               
                               
                                locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
                                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                                                DEFAULT_BEACON_TIME,
                                                DEFAULT_BEACON_DISTANCE,locListener);
                               
                               
                                try {
                                        synchronized (CURRENT_LOCATION_LOCK) {
                                                if (curLocation != null) {
                                                        lat = curLocation.getLatitude();
                                                        lon = curLocation.getLongitude();
                                                        alt = curLocation.getAltitude();
                                                        curTime = curLocation.getTime();
                                                }
                                        }
                                        //.....................................

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Dubbio Override
« Risposta #9 il: 16 Novembre 2010, 12:54:30 CET »
0
Comunque dichiara come attributo della tua classe activity un oggetto che implementa LocationListener:

Quindi:

Codice (Java): [Seleziona]
import java.util.List;

//import com.google.android.maps.GeoPoint;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
//import android.database.sqlite.SQLiteDatabase;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.net.wifi.ScanResult;
//import android.net.wifi.WifiConfiguration;
//import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiManager.WifiLock;
import android.os.Bundle;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class StartLookForW extends Activity implements LocationListener {

        private WakeLock wakeLock = null;
        private static final Object CURRENT_LOCATION_LOCK = new Object();

        private WifiManager wifiManager = null;
        private WifiLock wifiLock = null;
        private static int prevWifiState = 1;
        private BroadcastReceiver wifiReceiver = null;

        private LocationManager locationManager = null;
        private Location curLocation = null;

        private static final LocationListener locListener = new LocationListener(){ //implementazione dell'interfaccia };

        //.......................

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.stop);

                //.....................
                  .......................


                IntentFilter i = new IntentFilter();
                i.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
               
               
                       
               
                wifiReceiver = new BroadcastReceiver(){
                        @Override
                public void onReceive(Context context, Intent intent) {
                                /*
                                 * Code to execute when SCAN_RESULTS_AVAILABLE_ACTION event occurs
                                 */

                                Double lat = null, lon = null, alt = null;
                                long curTime = 0;
                               
                               
                                locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
                                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                                                DEFAULT_BEACON_TIME,
                                                DEFAULT_BEACON_DISTANCE,locListener);
                               
                               
                                try {
                                        synchronized (CURRENT_LOCATION_LOCK) {
                                                if (curLocation != null) {
                                                        lat = curLocation.getLatitude();
                                                        lon = curLocation.getLongitude();
                                                        alt = curLocation.getAltitude();
                                                        curTime = curLocation.getTime();
                                                }
                                        }
                                        //.....................................

Offline asterix07

  • Nuovo arrivato
  • *
  • Post: 45
  • Respect: 0
    • Mostra profilo
Re:Dubbio Override
« Risposta #10 il: 16 Novembre 2010, 13:08:42 CET »
0
Ah ok! scusa avevo letto male quello che mi avevi scritto prima, non avevo notato la chiusura della parentesi e pensavo aq cosa metterci dentro non trovando una logica. Piu tardi provo, grazie sei stato utilissimo

Offline asterix07

  • Nuovo arrivato
  • *
  • Post: 45
  • Respect: 0
    • Mostra profilo
Re:Dubbio Override
« Risposta #11 il: 16 Novembre 2010, 13:22:14 CET »
0
Quindi poi tutti i metodi di LocationLister che sono stati implementati tramite override li porto nella "implementazione interfaccia"e levo l'implements dell'activity?

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Dubbio Override
« Risposta #12 il: 16 Novembre 2010, 13:24:26 CET »
0
Non avevo proprio visto che la tua Activity implementava LocationListener  :-[

A questo punto puoi fare come ti dicevo io e dichiararti il tuo oggetto oppure lasciare così com'è e nel requestLocationUpdates utilizzare Activity.this.

Offline asterix07

  • Nuovo arrivato
  • *
  • Post: 45
  • Respect: 0
    • Mostra profilo
Re:Dubbio Override
« Risposta #13 il: 16 Novembre 2010, 13:59:17 CET »
0
E' proprio qua il problema, infatti a me non sembrava una modifica enorme da apportare. Se il locationManager lo dichiaro all esterno del metodo del BroadcastReceiver non ci sono problemi, ma se lo implemento dentro il metodo onReceive (vedi codice post sopra) non mi consente di passargli Activity.this come parametro.
In primo luogo mi dice che  non va passata un activity, e poi:
-No enclosing instance of the type Activity is accessible in scope
-

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Dubbio Override
« Risposta #14 il: 16 Novembre 2010, 14:05:36 CET »
0
Allora prova come ti ho suggerito inizialmente :)