Asincpressk para suscribirse a la ubicación actual -- # campo con android campo con asynchronous campo con google-maps campo con xamarin camp codereview Relacionados El problema

AsyncTask for subscribing to current location


0
vote

problema

Español

Hice el siguiente CurrentLocationTask como una forma de reducir la duplicación de código, ya que mi aplicación tiene actualmente 2 diferentes 9988776655544332 s que usan GoogleApiClient y OnLocationChanged .

La tarea se conecta básicamente un GoogleApiClient , luego usa un LocationRequest para suscribirse a RequestLocationUpdates .

En el método OnLocationChanged GoogleApiClient9 se actualiza, y el evento 998877765555443310 se enciende.

Porque el CurrentLocationTask1 es público, se puede suscribir a partir de la actividad requerida. Por lo tanto, la tarea se puede llamar desde un CurrentLocationTask2 en el que necesitamos obtener la ubicación actual del usuario.

Uso

onCreate

Crear un nuevo CurrentLocationTask3 CurrentLocationTask4 , pasando en la actividad actual como CurrentLocationTask5 . Luego suscríbase al evento CurrentLocationTask6 con CurrentLocationTask7 :

  CurrentLocationTask8  

onCurrentLocationChanged

Podemos obtener CurrentLocationTask9 FROM EL Activity0 :

  Activity1  

ontstop

En Activity2 , Activity3 El Activity4 :

  Activity5  

El código para el Activity6 está a continuación. Cualquier recomendación es muy apreciada.

No estoy seguro de si usando Activity7 es la mejor manera de hacer esto, especialmente porque no creo que gran parte del Código aquí se llama en Activity8 .

CurrentLocationTask

  Activity9  
Original en ingles

I made the below CurrentLocationTask as a way of reducing code duplication, as my application currently has 2 different Activitys which both use GoogleApiClient and OnLocationChanged.

The task basically connects a GoogleApiClient, then uses a LocationRequest to subscribe to RequestLocationUpdates.

In the OnLocationChanged method, CurrentLocation is updated, and the PropertyChanged event is fired.

Because the PropertyChangedEventHandler is public, it can be subscribed to from the required Activity. So the task can be called from an Activity on which we need to get the user's current location.

Usage

OnCreate

Create a new CurrentLocationTask and Execute, passing in the current activity as context. Then subscribe to the PropertyChanged event with OnCurrentLocationChanged:

protected override void OnCreate(Bundle bundle) {     base.OnCreate(bundle);     SetContentView(Resource.Layout.Main);      // Subscribe to current location     _currentLocationTask = new CurrentLocationTask();     _currentLocationTask.Execute(this);     _currentLocationTask.PropertyChanged += OnCurrentLocationChanged; } 

OnCurrentLocationChanged

We can get CurrentLocation from the CurrentLocationTask:

private void OnCurrentLocationChanged(object sender, PropertyChangedEventArgs e) {     _currentLocation = _currentLocationTask.CurrentLocation; } 

OnStop

In OnStop, Disconnect the GoogleApiClient:

protected override void OnStop() {     base.OnStop();     _currentLocationTask.Client.Disconnect(); } 

The code for the AsyncTask is below. Any recommendations are much appreciated.

I'm not sure if using AsyncTask is the best way of doing this, especially since I don't think very much of the code here is actually being called in RunInBackground.

CurrentLocationTask

using System.Linq; using System.ComponentModel; using Android.OS; using Android.Gms.Common.Apis; using Android.Gms.Common; using Android.Gms.Location; using Android.Locations; using Android.Content;  namespace WeatherApp.Droid {     class CurrentLocationTask :          AsyncTask<Context, int, Java.Lang.Void>,         GoogleApiClient.IConnectionCallbacks,         GoogleApiClient.IOnConnectionFailedListener,         Android.Gms.Location.ILocationListener,         INotifyPropertyChanged     {         public event PropertyChangedEventHandler PropertyChanged;         public Location CurrentLocation { get; set; }         public GoogleApiClient Client;          private LocationRequest _locationRequest;         private Context _context;          // AsyncTask         protected override Java.Lang.Void RunInBackground(params              Context[] context)         {             _context = context.First();             // Build the client and connect             Client =                  new GoogleApiClient.Builder(_context)                 .AddApi(LocationServices.API)                 .AddConnectionCallbacks(this)                 .Build();              Client.Connect();              return null;         }          // API connection         public void OnConnected(Bundle connectionHint)         {             _locationRequest = LocationRequest.Create();             _locationRequest.SetPriority(LocationRequest.PriorityHighAccuracy);             _locationRequest.SetInterval(1000);              LocationServices.FusedLocationApi.RequestLocationUpdates(                 Client, _locationRequest, this);         }         public void OnConnectionFailed(ConnectionResult result)         {             MessageBox.Show(_context, "Connection Failed");         }         public void OnConnectionSuspended(int cause)         {             MessageBox.Show(_context, "Connection Suspended");         }          // Location changed         public void OnLocationChanged(Location location)         {             CurrentLocation = location;              PropertyChanged?.Invoke(this,                 new PropertyChangedEventArgs("CurrentLocation"));         }     } } 
              

Lista de respuestas

2
 
vote
vote
La mejor respuesta
 

Nota: lo siguiente se refiere al desarrollo nativo de Android, no estoy familiarizado con Xamarin.

sobre el enfoque Depende de cuál es tu objetivo. La desventaja de usar asintsetk es que está atado a la actividad que lo está llamando. Recientemente implementé un seguimiento continuo de la ubicación, donde asintsasks no era una opción, ya que el proceso de seguimiento continuo no está vinculado a una actividad en particular. Así que opté por una implementación de servicio de Android en su lugar. El servicio estaba en su propia clase y, mientras se puede unir a un servicio en una actividad determinada, me fui por el patrón de EventBus (sin embargo, hay otras opciones), lo que significa que cada vez que el Servicio de localización obtuvo una nueva ubicación, cargaría la ubicación más reciente. y propague un evento a través del EventBus. De esta manera, los suscriptores (como las actividades) se informarían de los cambios de ubicación y podrían actualizar la UI en consecuencia.

Sin embargo, si solo desea consultar para ubicaciones dentro de la actividad del mapa, entonces una másncelería puede ser suficiente (lo pondría en un archivo de clase separado, por lo que es reutilizable). El inconveniente de este enfoque es que, dado que solo comienza a solicitar ubicaciones una vez que ingrese la vista del mapa, puede tomar un momento para obtener una ubicación viable.

 

Note: the following refers to native Android development, I am not familiar with xamarin.

About the approach It depends on what your aim is. The downside of using AsyncTask is that it's tied to the Activity you're calling it from. I recently implemented continuous location tracking, where AsyncTasks were not an option, as the process of continuous tracking is not tied to a particular activity. So I opted for an Android Service implementation instead. The Service was in it's own class and while you could bind to a service in a given Activity I instead went for the EventBus pattern (there are other options though) - meaning every time the LocationService obtained a new location it would cache the most recent location and propagate an Event via the Eventbus. This way subscribers (such as Activities) would be informed of location changes and could update the UI accordingly.

However, if you only want to query for locations within the Map Activity, then an AsyncTask may in fact be enough (I would put that in a separate class file though so it's reusable). The downside of this approach is, that since you only start asking for locations once you enter the Map view, it may take a moment to obtain a viable location.

 
 

Relacionados problema

1  Análisis de mensajes de jabón de un servicio web  ( Parsing soap messages from a web service ) 
Estoy consumiendo un servicio ASMX con mensajes de jabón. Dado que Xamarin no admite SOAP 1.2, estoy escribiendo las solicitudes web manualmente. Estoy envian...

1  Inicio de sesión de flujo en la aplicación  ( Login flow in app ) 
Hice el flujo de inicio de sesión sin ninguna referencia a un tutorial. Así que quiero algunos comentarios. Básicamente, envía el nombre de usuario y la con...

3  Clase de prueba TDD para la clase ViewModel  ( Tdd test class for viewmodel class ) 
Actualmente estoy escribiendo mi primera aplicación TDD. El proyecto está en Xamarin.Forms y probado en XUNIT. También estoy usando AutoFAC y MOQ. La prime...

1  Menús de navegación en pruebas de automatización  ( Navigating menus in automation tests ) 
Estoy tratando de escribir un método que pueda encontrar el elemento secundario en un menú. El siguiente código funciona pero no es exactamente elegante o esc...

2  Inicializando el desastre de datos del grupo  ( Initializing group data mess ) 
Este es mi método ONPAPEARINGASYNC, donde i como una carga de página en Xamarin I Filter Data, agrupa juntos, configure los datos en función de él, solicite l...

2  Autenticación API API ASP.NET para la aplicación Xamarin  ( Asp net web api authentication for xamarin app ) 
Recientemente se me ha aprendido a implementar una autenticación basada en token con ASP.NET y me encantaría obtener algunas entradas sobre cómo mi código & A...

4  Mostrando artículos y categorías después de hacer clic en una subcategoría  ( Showing items and categories after clicking on a subcategory ) 
¿Cómo puedo acelerar mi aplicación? Es muy lento si hago clic en un botón y abre una nueva página. Todos los datos en el tiempo es local. No estoy seguro de s...

3  Lista de dispositivos Bluetooth cercanos, así como dispositivos en la base de datos  ( List nearby bluetooth devices as well as devices in the database ) 
Hice una lista de todos los dispositivos de impresora cercanos (que coinciden con el mismo nombre en la base de datos), así como todos los dispositivos de imp...

2  Lector SmartBand2 Android en Xamarin  ( Android smartband2 reader in xamarin ) 
Este código fue escrito hace mucho tiempo, pero probablemente se ha deprimido un poco ahora y me pregunto cómo se puede mejorar. Es para un proyecto multiplat...

1  Validación de la entrada del usuario en C # provenientes de los controles XAML  ( Validating user input in c coming from xaml controls ) 
Tengo página donde estoy insertando algunos datos en campos de entrada. Para cada entrada, he escrito en XAML diferentes controles con parámetros. Uno de ello...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos