2013-01-02 39 views
5

服務開始我得到這個:android.os.NetworkOnMainThreadException Android上

我猜是有關清單文件和權限的東西,該服務是通過最後一項活動開始後,更新服務器上的數據並提取新的數據和SQLite的ID保存在Android上:

這裏也清單文件:

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

的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 

我做錯了什麼?

這也是服務:

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

你嘗試從異步任務撥打維修電話呢?它說網絡上的主線程異常也沒有足夠的服務經驗 – vodich

+1

仔細閱讀本[線程] [1]。 我希望這會解決您的問題。 [1]:http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception –

+0

你在做什麼錯的是你的網絡在UI線程上,作爲錯誤提示。你也做錯了是這個問題已經被回答了幾千次,但你在提問之前找過答案。 – njzk2

回答

8

發生這種情況是因爲您正在主線程上執行網絡操作,並且這在Android 3.0及更高版本中是不允許的。即使它在服務中,服務也會在UI線程上運行,除非您專門在另一個線程中啓動它們或在其中創建一個線程。

通過使用​​或​​,您可以通過在主UI線程的服務中運行任務來修復此問題。

嘗試按照@CommonsWare的建議在onStartCommand()中創建一個新線程。

+1

是的,你需要使用後臺線程。不,您的解決方案不起作用。做這項工作的人需要有後臺線程,在這種情況下,這就是服務。 'onStartCommand()'需要線程(可能通過將其轉換爲'IntentService')。你只是試圖從後臺線程綁定,這將不會影響用於'onStartCommand()',這是主要的應用程序線程的線程。 – CommonsWare

+0

@CommonsWare感謝您的糾正。我編輯了答案。 –

+0

THX的那一抹 –

3

As per the documentation,即使您使用一個Service執行長時間運行的操作,服務本身的應用程序的主線程上運行。所以你必須產生一個新的線程來執行可能長時間運行的任務,比如網絡訪問。

Android的StrictMode實際上檢查在主線程上執行的網絡操作並拋出NetworkOnMainThreadException

1

試試這個。 How to fix android.os.NetworkOnMainThreadException?

請仔細閱讀本主題。

我希望這能解決您的問題。

+2

我住這個問題,並解決了這樣\t'新的處理程序()。後(新的Runnable(){ \t \t \t \t \t \t @覆蓋 \t \t \t公共無效的run(){ \t getData(); \t \t \t} \t \t}); – nesimtunc

4

創建功能:

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

而且從onStartCommand

thread.start(); 
相關問題