Comment obtenir contexte dans android classe de Service
Je reçois le message d'erreur suivant lorsque j'essaie de lire un fichier XML à partir de la mémoire et dans un objet. Semble comme problème à l'obtention du Contexte. Quelqu'un peut me dire quel est le problème avec mon code?
Code:
public class WifiScanning extends Service {
private static final String TAG = "WifiScanning";
private Timer timer;
public int refreshRate;
public WifiScanning() {
super();
Configuration config = new Configuration();
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp;
XMLReader xr = null;
DataHandler dataHandler = null;
try {
sp = spf.newSAXParser();
xr = sp.getXMLReader();
dataHandler = new DataHandler();
xr.setContentHandler(dataHandler);
xr.parse(new InputSource(this.openFileInput("config.xml")));
} catch (ParserConfigurationException e) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
config = dataHandler.getConfig();
refreshRate = Integer.parseInt(config.getMapRefreshRate());
//TODO Auto-generated constructor stub
}
private TimerTask updateTask = new TimerTask() {
@Override
public void run() {
Log.i(TAG, "Timer task doing work");
}
};
@Override
public IBinder onBind(Intent intent) {
//TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
super.onCreate();
Log.i(TAG, "Service creating");
timer = new Timer("TweetCollectorTimer");
Log.i(TAG, "Refresh Rate: "+ String.valueOf(refreshRate));
timer.schedule(updateTask, 0, 3000L);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.i(TAG, "Service destroying");
if (timer != null){
timer.cancel();
timer.purge();
timer = null;
}
}
public void onStop() {
Log.i(TAG, "Service destroying");
if (timer != null){
timer.cancel();
timer.purge();
timer = null;
}
}
}
LogCat:
10-01 11:08:49.804: ERROR/AndroidRuntime(21514): java.lang.RuntimeException: Unable to instantiate service android.wps.WifiScanning: java.lang.NullPointerException
10-01 11:08:49.804: ERROR/AndroidRuntime(21514): at android.app.ActivityThread.handleCreateService(ActivityThread.java:2764)
10-01 11:08:49.804: ERROR/AndroidRuntime(21514): at android.app.ActivityThread.access$3200(ActivityThread.java:119)
10-01 11:08:49.804: ERROR/AndroidRuntime(21514): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1917)
10-01 11:08:49.804: ERROR/AndroidRuntime(21514): at android.os.Handler.dispatchMessage(Handler.java:99)
10-01 11:08:49.804: ERROR/AndroidRuntime(21514): at android.os.Looper.loop(Looper.java:123)
10-01 11:08:49.804: ERROR/AndroidRuntime(21514): at android.app.ActivityThread.main(ActivityThread.java:4363)
10-01 11:08:49.804: ERROR/AndroidRuntime(21514): at java.lang.reflect.Method.invokeNative(Native Method)
10-01 11:08:49.804: ERROR/AndroidRuntime(21514): at java.lang.reflect.Method.invoke(Method.java:521)
10-01 11:08:49.804: ERROR/AndroidRuntime(21514): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
10-01 11:08:49.804: ERROR/AndroidRuntime(21514): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
10-01 11:08:49.804: ERROR/AndroidRuntime(21514): at dalvik.system.NativeStart.main(Native Method)
10-01 11:08:49.804: ERROR/AndroidRuntime(21514): Caused by: java.lang.NullPointerException
10-01 11:08:49.804: ERROR/AndroidRuntime(21514): at android.content.ContextWrapper.openFileInput(ContextWrapper.java:152)
10-01 11:08:49.804: ERROR/AndroidRuntime(21514): at android.wps.WifiScanning.<init>(WifiScanning.java:52)
10-01 11:08:49.804: ERROR/AndroidRuntime(21514): at java.lang.Class.newInstanceImpl(Native Method)
10-01 11:08:49.804: ERROR/AndroidRuntime(21514): at java.lang.Class.newInstance(Class.java:1479)
10-01 11:08:49.804: ERROR/AndroidRuntime(21514): at android.app.ActivityThread.handleCreateService(ActivityThread.java:2761)
10-01 11:08:49.804: ERROR/AndroidRuntime(21514): ... 10 more
Avez-vous essayé IntentService. Il est beaucoup plus facile à manipuler. Btw, le Service s'étend Contexte.
mais est-ce la classe de lire le fichier à partir de la mémoire?
mais est-ce la classe de lire le fichier à partir de la mémoire?
OriginalL'auteur user918197 | 2011-10-01
Vous devez vous connecter pour publier un commentaire.
Vous devriez faire ce pas dans le constructeur, mais seulement entre (inclus) onCreate() et onDestroy().
Je veux dire, que pour le système Android, les Activités et les Services ne vivent pas entre les appels de constructeur et de collecte des ordures, mais leur vie commence à partir de l'appel onCreate() et se termine après appel onDestroy(). Je veux dire, que vous pouvez faire toutes les actions/interactions avec les services de la méthode onCreate() ou plus tard, avant le onDestroy(). Constructeur de service est appelé avant onCreate().
merci de me le dire. mon code fonctionne après j'ai changé les codes dans le constructeur de onCreat().
Aussi, vous pouvez lire les fichiers XML charger des sons et ainsi de suite dans onBind(), onStart(), onUnbind() (bien que je ne peux pas imaginer une telle situation), onRebind() ou toute autre méthode (aussi self-made) s'est produite après onCreate(). Par exemple, je lier avec le service et après la liaison, j'appelle self-made méthode loadSounds() - le contexte n'est pas nulle, de sorte que le service fonctionne.
OriginalL'auteur QuickNick
Si vous utilisez un service, vous êtes censés écrire ce code dans onStartCommand, pas dans le constructeur
Oui. onStartCommand() est appelée par le système à chaque fois qu'un client explicitement démarre le service à l'aide de startService()
donc vous voulez dire que je peux récupéré le contexte de l'intention qui est de passer à la Servce client explicitement démarre le service?
Non, puisque l'Intention des vies en dehors du Contexte. Pourquoi avez-vous besoin le contexte? Ce qui est sur la ligne 52 de WifiScanning.java?
cause j'ai besoin de lire des données à partir du XML que je stocke dans la mémoire. la ligne 52, public void onCreate()?
OriginalL'auteur Reno