2012-04-17 19 views
1

私は電話から自分のサーバーにデータをアップロードするインテントサービスを持っています。ネットワーク接続が利用できるときはいつでも、ブロードキャストレシーバーから開始します。それはすべて正常に動作しますが、私がAndroid 4.0.3エミュレータでテストすると、厳密なモードエラーandroid.os.NetworkOnMainThreadExceptionが発生します。このネットワークジョブはメインスレッドにありますが、intentserviceがワーカースレッドを作っていることがわかっている限りです。私はこのリンクを見つけました。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());  

} 

そして、これは私がLogCatに表示されるエラーです:メイン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()メソッドをチェックし、そしてAndroidは、ブロッキングと考えています。私は、アクティビティの接続性をチェックせずにIntentServiceへのリクエストを起動し、IntentServiceが例外をスローして、接続できない場合にアクティビティにレポートするようにします。

+0

ありがとう、それは解決されました:) – Marjan

0

コードをIntentServiceに移動します。ブロードキャスト受信者のonReceiveメソッドはUIスレッド上で実行され、ネットワークコードによってクラッシュが発生しています。インテントをIntentServiceにリダイレクトするだけで大​​丈夫です。

これによりコードも簡単になります。レシーバは、メッセージをシステムからアプリケーションにリダイレクトするためにそこにある複雑なロジックを行うことを本当に意図していません。サービスは、バックグラウンドで大量の作業を行うためのものです。

+0

はい、感謝私はintentserviceに移動:) – Marjan

関連する問題