2013-01-02 17 views
5

nach meinem neuen Dienst auf Android versucht, bekomme ich diese:android.os.NetworkOnMainThreadException auf Dienststart auf Android

ich denke, ist etwas in die Manifest-Datei und Berechtigungen im Zusammenhang, wird der Dienst nach der letzten Aktivität, Daten auf dem Server zu aktualisieren und neue Daten abrufen und ID auf sQLite auf android sparen:

hier auch die Manifest-Datei:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.ggservice.democracy" 
     android:versionCode="1" 
     android:versionName="1.0" > 

     <uses-sdk 
      android:minSdkVersion="8" 
      android:targetSdkVersion="17" /> 
     <uses-permission android:name="android.permission.INTERNET"/> 

     <application 
      android:allowBackup="true" 
      android:icon="@drawable/ic_launcher" 
      android:label="@string/app_name" 
      android:theme="@style/AppTheme" > 
      <activity 
       android:name="com.ggservice.democracy.MainActivity" 
       android:label="@string/app_name" > 
       <intent-filter> 
        <action android:name="android.intent.action.MAIN" /> 

        <category android:name="android.intent.category.LAUNCHER" /> 
       </intent-filter> 
      </activity> 
      <activity android:label="@string/app_name" android:name="com.ggservice.democracy.sondaggioActivity"/> 
      <activity android:label="@string/app_name" android:name="com.ggservice.democracy.domandeDiCategoria"/> 
      <service android:name="com.ggservice.democracy.updateDemocracyService" /> 
     </application> 

    </manifest> 

die logcat:

01-02 15:33:30.960: W/dalvikvm(2570): threadid=1: thread exiting with uncaught exception (group=0x409c01f8) 
01-02 15:33:31.160: E/AndroidRuntime(2570): FATAL EXCEPTION: main 
01-02 15:33:31.160: E/AndroidRuntime(2570): java.lang.RuntimeException: Unable to start service [email protected] with Intent { cmp=com.ggservice.democracy/.updateDemocracyService }: android.os.NetworkOnMainThreadException 
01-02 15:33:31.160: E/AndroidRuntime(2570):  at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2376) 
01-02 15:33:31.160: E/AndroidRuntime(2570):  at android.app.ActivityThread.access$1900(ActivityThread.java:123) 
01-02 15:33:31.160: E/AndroidRuntime(2570):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210) 
01-02 15:33:31.160: E/AndroidRuntime(2570):  at android.os.Handler.dispatchMessage(Handler.java:99) 
01-02 15:33:31.160: E/AndroidRuntime(2570):  at android.os.Looper.loop(Looper.java:137) 
01-02 15:33:31.160: E/AndroidRuntime(2570):  at android.app.ActivityThread.main(ActivityThread.java:4424) 
01-02 15:33:31.160: E/AndroidRuntime(2570):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-02 15:33:31.160: E/AndroidRuntime(2570):  at java.lang.reflect.Method.invoke(Method.java:511) 
01-02 15:33:31.160: E/AndroidRuntime(2570):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
01-02 15:33:31.160: E/AndroidRuntime(2570):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
01-02 15:33:31.160: E/AndroidRuntime(2570):  at dalvik.system.NativeStart.main(Native Method) 
01-02 15:33:31.160: E/AndroidRuntime(2570): Caused by: android.os.NetworkOnMainThreadException 
01-02 15:33:31.160: E/AndroidRuntime(2570):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099) 
01-02 15:33:31.160: E/AndroidRuntime(2570):  at java.net.InetAddress.lookupHostByName(InetAddress.java:391) 
01-02 15:33:31.160: E/AndroidRuntime(2570):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242) 
01-02 15:33:31.160: E/AndroidRuntime(2570):  at java.net.InetAddress.getAllByName(InetAddress.java:220) 
01-02 15:33:31.160: E/AndroidRuntime(2570):  at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137) 
01-02 15:33:31.160: E/AndroidRuntime(2570):  at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
01-02 15:33:31.160: E/AndroidRuntime(2570):  at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
01-02 15:33:31.160: E/AndroidRuntime(2570):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 
01-02 15:33:31.160: E/AndroidRuntime(2570):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
01-02 15:33:31.160: E/AndroidRuntime(2570):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
01-02 15:33:31.160: E/AndroidRuntime(2570):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 
01-02 15:33:31.160: E/AndroidRuntime(2570):  at com.ggservice.democracy.JSONParser.getJSONFromUrl(JSONParser.java:38) 
01-02 15:33:31.160: E/AndroidRuntime(2570):  at com.ggservice.democracy.updateDemocracyService.onStartCommand(updateDemocracyService.java:47) 
01-02 15:33:31.160: E/AndroidRuntime(2570):  at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2359) 
01-02 15:33:31.160: E/AndroidRuntime(2570):  ... 10 more 

mache ich etwas falsch?

dies ist auch der Service:

public class updateDemocracyService extends Service{ 
    private pollDataSource datasource; 
    int mStartMode;  // indicates how to behave if the service is killed 
     IBinder mBinder;  // interface for clients that bind 
     boolean mAllowRebind; // indicates whether onRebind should be used 
     // url to make request 
     private static String url = "http://www.test.com/democracy/domande.php"; 

     // JSON Node names 
     private static final String TAG_DOMANDE = "domande"; 
     private static final String TAG_ID = "id"; 
     private static final String TAG_TESTO = "testo"; 


     // contacts JSONArray 
     JSONArray contacts = null; 

     @Override 
     public void onCreate() { 
      // The service is being created 
      datasource = new pollDataSource(this); 
      datasource.open(); 

     } 
     @Override 
     public int onStartCommand(Intent intent, int flags, int startId) { 

      // Creating JSON Parser instance 
      JSONParser jParser = new JSONParser(); 

      // getting JSON string from URL 
      JSONObject json = jParser.getJSONFromUrl(url); 

      try { 
       // Getting Array of Contacts 
       contacts = json.getJSONArray(TAG_DOMANDE); 

       // looping through All Contacts 
       for(int i = 0; i < contacts.length(); i++){ 
        JSONObject c = contacts.getJSONObject(i); 

        // Storing each json item in variable 
        String id = c.getString(TAG_ID); 
        String name = c.getString(TAG_TESTO); 
        datasource.createCategoria(name); 
       } 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 




      Toast.makeText(this, "ho comunicato con un server!", Toast.LENGTH_LONG).show(); 
      return mStartMode; 
     } 
     @Override 
     public IBinder onBind(Intent intent) { 
      // A client is binding to the service with bindService() 
      return mBinder; 
     } 
     @Override 
     public boolean onUnbind(Intent intent) { 
      // All clients have unbound with unbindService() 
      return mAllowRebind; 
     } 
     @Override 
     public void onRebind(Intent intent) { 
      // A client is binding to the service with bindService(), 
      // after onUnbind() has already been called 
     } 
     @Override 
     public void onDestroy() { 
      datasource.close(); 
      // The service is no longer used and is being destroyed 
     } 


} 
+1

haben Sie versucht, Service von Asynchron-Aufgabe zu nennen? es sagt Netzwerk auf Hauptgewindeausnahme auch, ich habe nicht genug Erfahrung mit Dienstleistungen – vodich

+1

Lesen Sie dieses [thread] [1] sorgfältig. Ich hoffe, dass dies Ihr Problem lösen wird. [1]: http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception –

+0

, was Sie falsch machen, ist, dass Sie auf dem UI-Thread vernetzen, wie der Fehler vermuten läßt. Was Sie auch falsch machen, ist, dass diese Frage tausende Male beantwortet wurde, aber Sie haben nach einer Antwort gesucht, bevor Sie die Frage gestellt haben. – njzk2

Antwort

8

Dies passiert, weil Sie eine Netzwerkoperation auf dem Hauptthread ausführen, und dies ist nicht für Android 3.0 und höher zulässig. Obwohl es sich um einen Dienst handelt, werden Dienste auf dem Benutzeroberflächenthread ausgeführt, sofern Sie sie nicht ausdrücklich in einem anderen Thread starten oder einen Thread darin erstellen.

Sie können dies beheben, indem Sie die Aufgabe in einem Dienst im Hauptthread der Benutzeroberfläche ausführen, indem Sie eine Thread oder eine AsyncTask verwenden.

Versuchen Sie, einen neuen Thread in onStartCommand() zu erstellen, wie von @CommonsWare vorgeschlagen.

+1

Ja, Sie müssen einen Hintergrund-Thread verwenden. Nein, Ihre Lösung wird nicht funktionieren. Das, was die Arbeit erledigt, muss den Hintergrund-Thread haben, und in diesem Fall ist das der Service. 'onStartCommand()' benötigt den Thread (möglicherweise durch Umwandlung in einen 'IntentService'). Sie versuchen einfach, von einem Hintergrund-Thread zu binden, was keinen Einfluss auf den Thread hat, der für 'onStartCommand()' verwendet wird, welches der Hauptanwendungs-Thread ist. – CommonsWare

+0

@CommonsWare Vielen Dank für die Korrektur. Ich habe die Antwort bearbeitet. –

+0

THX für diesen Hinweis –

3

As per the documentation, obwohl Sie eine Service verwenden lange laufenden Operationen auszuführen, der Dienst selbst läuft auf der Haupt-Thread der Anwendung. Sie müssen also einen neuen Thread erstellen, um potenziell lang andauernde Aufgaben wie den Netzwerkzugriff auszuführen.

Android StrictMode überprüft tatsächlich für Netzwerkvorgänge, die auf dem Hauptthread ausgeführt werden, und wirft NetworkOnMainThreadException.

1

Versuchen Sie dies. How to fix android.os.NetworkOnMainThreadException?

Lesen Sie diesen Thread sorgfältig.

Ich hoffe, dass dies Ihr Problem lösen wird.

+2

Ich lebte nur dieses Problem und gelöst wie diese \t 'neue Handler(). Post (neu Runnable() { \t \t \t \t \t \t @Override \t \t \t public void run() { \t getData(); \t \t \t } \t \t}); ' – nesimtunc

4

Funktion erstellen:

Thread thread = new Thread(new Runnable(){ 
    @Override 
    public void run() { 
     ....... 
    } 
}); 

Und nennen Sie es aus onStartCommand

thread.start(); 
Verwandte Themen