2011-02-02 10 views
143

Tengo problemas para descargar las tareas desde el método principal de Actividades en Creación a otra clase para hacer el trabajo pesado.¿Cómo puedo usar getSystemService en una clase no activa (LocationManager)?

Cuando intento llamar a getSystemService desde la clase no activa, se produce una excepción.

Cualquier ayuda sería muy apreciada :)

lmt.java:

package com.atClass.lmt; 
import android.app.Activity; 
import android.os.Bundle; 
import android.widget.TextView; 
import android.location.Location; 

public class lmt extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     fyl lfyl = new fyl(); 
     Location location = lfyl.getLocation(); 
     String latLongString = lfyl.updateWithNewLocation(location); 

     TextView myLocationText = (TextView)findViewById(R.id.myLocationText); 
     myLocationText.setText("Your current position is:\n" + latLongString); 
    } 
} 

fyl.java

package com.atClass.lmt; 

import android.app.Activity; 
import android.os.Bundle; 
import android.location.Location; 
import android.location.LocationManager; 
import android.os.Bundle; 
import android.widget.TextView; 
import android.content.Context; 

public class fyl { 
    public Location getLocation(){ 
     LocationManager locationManager; 
     String context = Context.LOCATION_SERVICE; 
     locationManager = (LocationManager)getSystemService(context); 

     String provider = LocationManager.GPS_PROVIDER; 
     Location location = locationManager.getLastKnownLocation(provider); 

     return location; 
    } 

    public String updateWithNewLocation(Location location) { 
     String latLongString; 

     if (location != null){ 
      double lat = location.getLatitude(); 
      double lng = location.getLongitude(); 
      latLongString = "Lat:" + lat + "\nLong:" + lng; 
     }else{ 
      latLongString = "No Location"; 
     } 

     return latLongString; 
    } 
} 
+1

Añadiendo la excepción y seguimiento de la pila a la pregunta puede ayudar a potenciales que responden –

+0

Hola, Lo siento por el error. La excepción se produce si intento extender la clase Activity con esta. No quiero extender la clase Activity para esta clase y simplemente quiero poder llamar a getSystemService desde mi método getLocation. Excepción: java.lang.IllegalStateException: los servicios del sistema no están disponibles para Actividades antes de onCreate() –

Respuesta

235

lo necesario para pasar su contexto a su clase de cad ..
Una solución es hacer un constructor como este para su clase fyl:

public class fyl { 
Context mContext; 
public fyl(Context mContext) { 
     this.mContext = mContext; 
} 

public Location getLocation() { 
     -- 
     locationManager = (LocationManager)mContext.getSystemService(context); 

     -- 
} 
} 

Así que en su clase de actividad de crear el objeto de cad en onCreate función como esta:

package com.atClass.lmt; 
import android.app.Activity; 
import android.os.Bundle; 
import android.widget.TextView; 
import android.location.Location; 

public class lmt extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     fyl lfyl = new fyl(this); //Here the context is passing 

     Location location = lfyl.getLocation(); 
     String latLongString = lfyl.updateWithNewLocation(location); 

     TextView myLocationText = (TextView)findViewById(R.id.myLocationText); 
     myLocationText.setText("Your current position is:\n" + latLongString); 
    } 
} 
+0

Lo siento, pero no entiendo, el código sería más útil. En todo caso, debería pasar un objeto LocationManager al método getLocation ... Realmente no veo cómo voy a pasar el contexto al método cuando no puedo llamar a getSystemService sin escribir esta clase como una clase extendida en Activity. –

+0

¿Has probado esto?En onCreate, si está pasando, acceda al contexto con 'this' –

+0

, pero si la clase 'lmt' no se ejecutará,' fly 'no tendrá contexto – Hunt

-1
(LocationManager) ((lmt) new Activity()).getSystemService(context); 

probar este código. Esto solo funcionará si ha iniciado la actividad antes de llamar a esta línea de código. Como la actividad tiene que crearse y estar ejecutándose.

+0

Lamentablemente, esto ya no funciona; solo obtienes una excepción diciendo 'Servicios del sistema no disponibles para Actividades antes de onCreate()'. –

+1

Crear una nueva actividad solo para obtener el servicio del administrador de la ubicación me parece bastante absurdo. Tal vez solo puede poner una función estática en algunas de sus actividades ya existentes para obtener el administrador de ubicación. –

14

Una forma de evitar esto es crear una clase estática para las instancias. Lo usé mucho en AS3. También funcionó muy bien para mí en el desarrollo de Android.

Config.java

public final class Config { 
    public static MyApp context = null; 
} 

MyApp.java

public class MyApp extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     Config.context = this; 
    } 
    ... 
} 

A continuación, puede acceder al contexto o mediante el uso de Config.context

LocationManager locationManager; 
String context = Context.LOCATION_SERVICE; 
locationManager = Config.context.getSystemService(context); 
+3

El problema que veo con este método es que deja algo desprotegido que, si alguien le asignara nulo, ¿probablemente produciría una falla catastrófica? – Rob

+1

Una variante de esto es poner una estática privada en MyApp, y luego agregar getters. 'private static MyApp _context;' 'public static MyApp getContext() {return _context; } '... en onCreate:' _context = this; 'en onStop:' _context = null; '... Uso:' MyApp.getContext() '. – ToolmakerSteve

+0

Puede provocar una fuga de memoria – Yat3s

37

Usted puede ir para este :

getActivity().getSystemService(Context.CONNECTIVITY_SERVICE); 
+1

simple y directo al grano. – dazito

+1

El método getActivity() no está definido para la clase. Este error aparece. – Darpan

+0

¿Cuál es el tipo de clase en el que lo está usando? es decir, es una clase de receptor, fragmento, clase Java simple o cualquier otro. – Maddy

0

No sé si esto ayuda, pero lo hice:

LocationManager locationManager = (LocationManager) context.getSystemService(context.LOCATION_SERVICE); 
Cuestiones relacionadas