4 Stimmen

NetworkOnMainThreadException im Dienst

Ich bekomme eine NetworkOnMainThreadException in meinem Service Klasse, was von Natur aus keinen Sinn macht, denn Dienste sind Hintergrundprozesse, soweit ich weiß.

In der Service-Methode rufe ich eine statische Hilfsmethode auf, um Daten herunterzuladen. Ich verwende auch den DefaultHttpClient.

Was ist denn hier los?

0 Stimmen

Können Sie Ihren Code zeigen, um die Untersuchung zu erleichtern?

0 Stimmen

Sehen Sie sich meinen Beitrag über die NetworkOnMainThreadException . Er erklärt, warum dies der Fall sein könnte.

5voto

Paul Burke Punkte 25308

onStartCommand() läuft auf dem UI-Thread in einer Service . Versuchen Sie es mit IntentService oder alternativ eine beliebige andere Einfädelungsmethode in der Service ( Handler / Runnable , AsyncTask ).

0 Stimmen

Es ist nicht erlaubt, AsyncTask im Service aufzurufen, weil es vom Main Tread ausgeführt werden sollte, habe ich Recht?

0 Stimmen

@bgplaya Sie können definitiv verwenden AsyncTask in einem Service . Wie ich bereits sagte, ist eine regelmäßige Service läuft auf dem Hauptthread (UI).

0 Stimmen

Ich sollte meinen Code überprüfen, aber es scheint, als hätte ich Probleme mit AsyncTask en Service : vielleicht habe ich es nur nicht in onStartCommand()

0voto

SimonVT Punkte 1080

Alle Service-Callbacks laufen auf dem Hauptthread, auch bekannt als UI-Thread. Wenn Sie im Hintergrund arbeiten möchten, starten Sie entweder einen Thread oder verwenden Sie die Funktion onHandleIntent(Intent i) von IntentService.

0voto

hector6872 Punkte 1336

Die Ausnahme, die ausgelöst wird, wenn eine Anwendung versucht Netzwerkoperation auf ihrem Hauptthread durchzuführen.

Dies wird nur für Anwendungen geworfen, die auf oder höher. Anwendungen, die auf frühere SDK-Versionen ausgerichtet sind, dürfen Threads ihrer Hauptereignisschleife zu vernetzen, aber das ist stark entmutigt.

http://developer.Android.com/reference/Android/os/NetworkOnMainThreadException.html

0voto

J.P Punkte 25

Ich habe dieses Problem soeben mit dem hier gelöst:

public int onStartCommand(Intent intent, int flags, int startId) {

    RefreshDBAsync task = new RefreshDBAsync(this);
    task.execute();

    return START_STICKY;
}

RefreshDBAsync stellt alle 5 Minuten eine Anfrage an einen Server

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X