2013-01-02 27 views
5

sau khi thử dịch vụ mới thương hiệu của tôi trên android tôi có được điều này:android.os.NetworkOnMainThreadException về dịch vụ bắt đầu trên android

tôi đoán là một cái gì đó liên quan đến file manifest và điều khoản, dịch vụ này được bắt đầu sau khi các hoạt động cuối cùng, để cập nhật dữ liệu trên máy chủ và lấy dữ liệu mới và lưu id trên sqlite trên android:

đây cũng là file manifest:

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

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

Tôi có làm gì sai không?

đây cũng là dịch vụ:

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

bạn đã cố gắng gọi cho dịch vụ từ công việc async? nó nói mạng về ngoại lệ chủ đề chính cũng có, tôi không có đủ kinh nghiệm với các dịch vụ – vodich

+1

Đọc [thread] [1] cẩn thận này. Tôi hy vọng điều này sẽ giải quyết được vấn đề của bạn. [1]: http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception –

+0

gì bạn đang làm sai là bạn đang kết nối mạng trên thread ui, như lỗi gợi ý. những gì bạn cũng đang làm sai là câu hỏi này đã được trả lời hàng ngàn lần, nhưng bạn đã tìm kiếm một câu trả lời trước khi đặt câu hỏi. – njzk2

Trả lời

8

Điều này xảy ra vì bạn đang thực hiện thao tác mạng trên chuỗi chính và điều này không được phép trên Android 3.0 trở lên. Mặc dù nó nằm trong một dịch vụ, các dịch vụ được chạy trên chuỗi giao diện người dùng trừ khi bạn khởi chạy chúng một cách cụ thể trong một luồng khác hoặc tạo một luồng bên trong nó.

Bạn có thể khắc phục điều này bằng cách chạy tác vụ trong dịch vụ ngoài chuỗi giao diện người dùng chính, bằng cách sử dụng Thread hoặc AsyncTask.

Thử tạo chủ đề mới trong onStartCommand(), theo đề xuất của @CommonsWare.

+1

Có, bạn cần sử dụng chuỗi nền. Không, giải pháp của bạn sẽ không hoạt động. Điều làm công việc cần phải có chủ đề nền, và trong trường hợp này, đó là dịch vụ. 'onStartCommand()' cần chuỗi (có thể bằng cách chuyển đổi nó thành 'IntentService'). Bạn chỉ đơn giản cố gắng ràng buộc từ một luồng nền, mà sẽ không có tác động đến luồng được sử dụng cho 'onStartCommand()', đó là luồng ứng dụng chính. – CommonsWare

+0

@CommonsWare Cảm ơn bạn đã sửa. Tôi đã chỉnh sửa câu trả lời. –

+0

THX cho rằng gợi ý –

3

As per the documentation, ngay cả khi bạn sử dụng một Service để thực hiện các hoạt động chạy dài, Dịch vụ tự chạy trên chủ đề chính của ứng dụng. Vì vậy, bạn phải sinh ra một luồng mới để thực hiện các nhiệm vụ có khả năng chạy dài như truy cập mạng.

Android StrictMode thực sự kiểm tra các hoạt động mạng được thực hiện trên chuỗi chính và ném một số NetworkOnMainThreadException.

1

Hãy thử điều này. How to fix android.os.NetworkOnMainThreadException?

Đọc chủ đề này một cách cẩn thận.

Tôi hy vọng điều này sẽ giải quyết được vấn đề của bạn.

+2

Tôi chỉ sống vấn đề này và giải quyết như \t 'Handler mới(). Bài này (mới Runnable() { \t \t \t \t \t \t @ Override \t \t \t public void run() { \t getData(); \t \t \t} \t \t}); ' – nesimtunc

4

Tạo chức năng:

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

Và gọi nó từ onStartCommand

thread.start(); 
Các vấn đề liên quan