Comment faire pour exécuter le service pas sur le thread principal?
Je suis en train de lancer service
puis ouvrez socket
avoir une connexion avec le serveur.
Sur le bouton cliquez sur j'créer de nouveaux Thread
puis démarrer le service.
Thread t = new Thread(){
public void run(){
mIntent= new Intent(MainActivity.this, ConnectonService.class);
mIntent.putExtra("KEY1", "Value used by the service");
context.startService(mIntent);
}
};
t.start();
Puis sur service
, j'essaie d'ouvrir socket
et disposent d'une connexion avec le serveur
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//TODO do something useful
try {
InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
socket = new Socket(serverAddr, SERVERPORT);
Scanner scanner = new Scanner(socket.getInputStream());
message = scanner.nextLine();
} catch (IOException e) {
e.printStackTrace();
}
return Service.START_NOT_STICKY;
}
Mais quand je l'appelle, j'ai erreur
08-30 08:56:49.268: E/AndroidRuntime(3751): java.lang.RuntimeException: Unable to start service com.example.testofconnection.ConnectonService@40ef02a8 with Intent { cmp=com.example.testofconnection/.ConnectonService (has extras) }: android.os.NetworkOnMainThreadException*
Je pense que le problème est que service
est sur main thread
, mais je ne trouve pas comment dois-je démarrer le service sur les nouvelles (independend) filetage pour garder connection alive
?
- J'ai besoin de garder la connexion avec le serveur en vie. AsyncTask ne s'ouvre connexion, envoie une demande, a obtenu certains de réponse et se ferme, donc j'ai trouvé que le service que je peux la mettre en œuvre
- developer.android.com/guide/components/services.html. vérifiez le cadre du sujet à l'extension de la classe du service
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser IntentService pour cela. Il suffit de lancer normalement avec l'Intention de le thread principal.
onHandleIntent()
méthode est exécutée dans le thread d'arrière-plan. Mettre votre socket-code n'. Voici un exemple de code.Dans votre activité vous permet de démarrer le service, comme suit.
Si vous avez besoin d'une longue durée de service, vous pouvez créer un service normal et démarrer un thread là. Ici est un exemple. Assurez-vous de le lancer en tant que "premier plan" de service. Cela permettra de service de fonctionner plus longtemps sans été tué par Android.
Déplacer ce code à votre fil de discussion:
Juste comme exemple (je ne suis pas certain que cela correspond à votre tâche):
Vous devriez savoir qu'un service est en cours d'exécution sur le thread de l'INTERFACE utilisateur, si vous avez cette erreur. Vérifier ce joli site pour plus d'informations sur les différents filetage approches dans Android.
t
, à l'initiative depuis un service et son code est en cours d'exécution dans ce thread distinct, je suis à peu près sûr. Remarque: ne pas démarrer le thread avecrun()
mais avecstart()
!