1

電話からサーバーにデータをアップロードするインテントサービスがあります。ネットワーク接続が利用できるときはいつでも、私はそれを放送受信機から始めます。すべて正常に動作しますが、Android 4.0.3エミュレーターでテストすると、strictmodeエラーandroid.os.NetworkOnMainThreadExceptionが発生します。このネットワークジョブはメインスレッド上にあるようですが、私が知る限り、intentserviceはワーカースレッドを作成します。このリンクもhttp://code.google.com/p/android/issues/detail?id=23495で見つかりました。これは、ネットワークジョブをバックグラウンドスレッドに移動することを示しています。ワーカースレッドはバックグラウンドスレッドではありませんか?

編集:これは私の放送受信機です。

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で見るエラーです:

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
4

2 に答える 2

2

isNetworkAvailable()メソッドはメインUIスレッドのネットワークI / Oをチェックし、Androidはそのブロッキングを考慮します。アクティビティの接続を確認せずにIntentServiceへのリクエストを実行し、接続を確立できない場合はIntentServiceに例外をスローさせ、アクティビティに報告させます。

于 2012-04-17T17:17:42.990 に答える
0

コードをIntentServiceに移動します。ブロードキャストレシーバーのonReceiveメソッドはUIスレッドで実行され、ネットワークコードが原因でクラッシュします。インテントをIntentServiceにリダイレクトするだけで、問題はありません。

これにより、コードも簡単になります。受信者は、システムからアプリにメッセージをリダイレクトするために存在する複雑なロジックを実行することを実際には意図していません。サービスは、バックグラウンドで重い作業を行うことを目的としています。

于 2012-04-17T17:21:42.990 に答える