2012-04-17 2 views
1

휴대 전화에서 내 서버로 데이터를 업로드하는 인텐시브 서비스가 있습니다. 네트워크 연결이 가능할 때마다 브로드 캐스트 리시버에서 시작합니다. 그것은 모두 잘 작동하지만 안드로이드 4.0.3 에뮬레이터로 테스트하면 strictmode error android.os.NetworkOnMainThreadException이 발생합니다. 그것은이 네트워크 작업이 주 스레드에 있지만 인센티브 도구가 작업 스레드를 만드는 한 알 것입니다. 이 링크는 배경 스레드로 네트워크 작업 이동을 나타내는 http://code.google.com/p/android/issues/detail?id=23495을 발견했습니다. 작업자 스레드가 백그라운드 스레드가 아닌가?Android 4.0.3의 NetworkOnMainThreadException

편집 됨 : 내 브로드 캐스트 수신기입니다.

public void onReceive(Context context, Intent intent) { 
    final String UploadingItems = "paUploadingItems"; 
    final String preferencesFileName = "paSettings"; 

    SharedPreferences sharedPref; 
    String fileQueque; 

    if(isNetworkAvailable(context)){   

     sharedPref = context.getSharedPreferences(preferencesFileName,0); 
     fileQueque = sharedPref.getString(UploadingItems, ""); 
     Log.d(TAG, "quque"+fileQueque); 
     if(fileQueque.length() > 0){ 

       Intent intentUpdater = new Intent(context, updaterService.class);    
       intentUpdater.putExtra("processMode", 6); 
       intentUpdater.putExtra("fileq", fileQueque.toString()); 
       context.startService(intentUpdater); 

      } 
    }  

} 

private boolean isNetworkAvailable(Context context){ 
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();  
    Log.d(TAG, activeNetworkInfo.getTypeName()); 
    return (activeNetworkInfo != null && activeNetworkInfo.isAvailable() && activeNetworkInfo.isConnected());  

} 

그리고 이것은 내가 로그 캣에서 볼 수있는 오류입니다 : 메인 UI 스레드에서 I/O 네트워크에 대한

04-17 15:28:58.114: E/AndroidRuntime(574): FATAL EXCEPTION: main 
04-17 15:28:58.114: E/AndroidRuntime(574): java.lang.RuntimeException: Unable to start  receiver org.test.dairy.OnNetworkReceiver: android.os.NetworkOnMainThreadException 
04-17 15:28:58.114: E/AndroidRuntime(574): at android.app.ActivityThread.handleReceiver(ActivityThread.java:2126) 
04-17 15:28:58.114: E/AndroidRuntime(574): at android.app.ActivityThread.access$1500(ActivityThread.java:123) 
04-17 15:28:58.114: E/AndroidRuntime(574): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1197) 
04-17 15:28:58.114: E/AndroidRuntime(574): at android.os.Handler.dispatchMessage(Handler.java:99) 
04-17 15:28:58.114: E/AndroidRuntime(574): at android.os.Looper.loop(Looper.java:137) 
04-17 15:28:58.114: E/AndroidRuntime(574): at android.app.ActivityThread.main(ActivityThread.java:4424) 
04-17 15:28:58.114: E/AndroidRuntime(574): at java.lang.reflect.Method.invokeNative(Native Method) 
04-17 15:28:58.114: E/AndroidRuntime(574): at java.lang.reflect.Method.invoke(Method.java:511) 
04-17 15:28:58.114: E/AndroidRuntime(574): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
04-17 15:28:58.114: E/AndroidRuntime(574): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
04-17 15:28:58.114: E/AndroidRuntime(574): at dalvik.system.NativeStart.main(Native Method) 
04-17 15:28:58.114: E/AndroidRuntime(574): Caused by: android.os.NetworkOnMainThreadException 
04-17 15:28:58.114: E/AndroidRuntime(574): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099) 
04-17 15:28:58.114: E/AndroidRuntime(574): at java.net.InetAddress.lookupHostByName(InetAddress.java:391) 
04-17 15:28:58.114: E/AndroidRuntime(574): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242) 
04-17 15:28:58.114: E/AndroidRuntime(574): at java.net.InetAddress.getAllByName(InetAddress.java:220) 
04-17 15:28:58.114: E/AndroidRuntime(574): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:71) 
04-17 15:28:58.114: E/AndroidRuntime(574): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50) 
04-17 15:28:58.114: E/AndroidRuntime(574): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351) 
04-17 15:28:58.114: E/AndroidRuntime(574): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86) 
04-17 15:28:58.114: E/AndroidRuntime(574): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 
04-17 15:28:58.114: E/AndroidRuntime(574): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308) 
04-17 15:28:58.114: E/AndroidRuntime(574): at libcore.net.http.HttpEngine.connect(HttpEngine.java:303) 
04-17 15:28:58.114: E/AndroidRuntime(574): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282) 
04-17 15:28:58.114: E/AndroidRuntime(574): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232) 
04-17 15:28:58.114: E/AndroidRuntime(574): at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80) 
04-17 15:28:58.114: E/AndroidRuntime(574): at libcore.net.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:188) 
04-17 15:28:58.114: E/AndroidRuntime(574): at org.test.dairy.OnNetworkReceiver.transferData(OnNetworkReceiver.java:101) 
04-17 15:28:58.114: E/AndroidRuntime(574): at org.test.dairy.OnNetworkReceiver.onReceive(OnNetworkReceiver.java:57) 
04-17 15:28:58.114: E/AndroidRuntime(574): at android.app.ActivityThread.handleReceiver(ActivityThread.java:2119) 
04-17 15:28:58.114: E/AndroidRuntime(574): ... 10 more 
+0

방송 수신기에는 무엇이 있습니까? 모든 네트워크 IO? – SeanPONeil

+0

네트워크 오류가 귀하의 서비스가 아닌 귀하의 활동에서 오는 것이 확실합니까? – Shubhayu

+0

구현에 대한 의견을 보내주십시오. – CommonsWare

답변

2

귀하의 isNetworkAvailable() 메소드 검사 및 안드로이드 차단하는 것을 고려하고있다. Activity에서 연결을 확인하지 않고 IntentService에 대한 요청을 시작하고 연결을 만들 수없는 경우 IntentService에서 예외를 throw하고 Activity에 다시보고하도록합니다.

+0

감사합니다, 그것은 해결되었습니다 :) – Marjan

0

코드를 IntentService로 이동하십시오. 브로드 캐스트 수신기의 onReceive 메서드는 UI 스레드에서 실행되며 네트워크 코드로 인해 충돌이 발생합니다. 의도를 IntentService로 리디렉션하면됩니다.

이렇게하면 코드가 더 간단 해집니다. 수신기는 메시지를 시스템에서 앱으로 리디렉션하기 위해 실제로 존재하는 복잡한 논리를 의미하지 않습니다. 서비스는 백그라운드에서 과중한 업무를 수행하기위한 것입니다.

+0

네, 감사합니다 intentservice로 이동 :) – Marjan

관련 문제