android.os.NetworkOnMainThreadException on service start on android
Asked Answered
C

4

9

after trying my brand new service on android i get this:

i guess is something related to the manifest file and permissions, the service is started after the last activity, to update data on server and retrieve new data and save id on sqlite on android:

here also the manifest file:

 <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>

the 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 com.ggservice.democracy.updateDemocracyService@412f0c60 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

am i doing something wrong?

this is also the 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
        }


}
Cubitiere answered 2/1, 2013 at 15:39 Comment(4)
did you try to call service from async task? it says network on main thread exception also, I don't have enough experience with servicesFassold
Read this [thread][1] carefully. I hope this will solve your problem. [1]: #6343666Fourlegged
what you are doing wrong is that you are networking on the ui thread, as the error suggests. what you are also doing wrong is that this question has been answered thousands of times, but you did searched for an answer before asking the question.Jo
Try attribute on top of your class [Service(IsolatedProcess = true)] Note C# syntax.Barberabarberry
V
12

This happens because you are doing a network operation on the main thread, and this is not allowed on Android 3.0 and above. Even though it is in a service, services are run on the UI thread unless you specifically launch them in another thread or create a thread inside it.

You can fix this by running the task in a service off the main UI thread, by using a Thread or an AsyncTask.

Try creating a new thread in onStartCommand(), as suggested by @CommonsWare.

Vinegar answered 2/1, 2013 at 15:44 Comment(1)
Yes, you need to use a background thread. No, your solution won't work. The thing doing the work needs to have the background thread, and in this case, that's the service. onStartCommand() needs the thread (possibly by converting this to an IntentService). You are simply trying to bind from a background thread, which will have no impact on the thread used for onStartCommand(), which is the main application thread.Entrance
O
7

Create function:

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

And call it from onStartCommand

thread.start(); 
Ozonize answered 17/12, 2013 at 21:10 Comment(1)
Did not work for me. It will still run on the main thread. need to use AsyncTaskDubuffet
P
3

As per the documentation, even though you use a Service to perform long running operations, the Service itself runs on the application's main thread. So you have to spawn a new thread to perform potentially long running tasks like network access.

Android's StrictMode actually checks for network operations performed on the main thread and throws a NetworkOnMainThreadException.

Phraseograph answered 2/1, 2013 at 15:43 Comment(0)
F
1

Try this. How to fix android.os.NetworkOnMainThreadException?

Read this thread carefully.

I hope this will solve your problem.

Fourlegged answered 2/1, 2013 at 15:50 Comment(1)
I just lived this problem and solved like this new Handler().post(new Runnable() { @Override public void run() { getData(); } });Redoubt

© 2022 - 2024 — McMap. All rights reserved.