0

私のAndroidアプリケーションにはBroadcastReceiver. Service最初に、10 分ごとに定期的に受信者を呼び出すためのを開始しAlarmManager、受信者は http 接続を試みます。受信者が httpConnection を作成しようとすると、行httpConnection.getResponseCode();または中に時間がかかる場合がandroidHttpTransport.call(soapAction, envelope);あり、このような状況では android UI (Activity) がハングし、受信者の操作が完了するまで待機します。しかし、BroadcastReceiver の操作は別のスレッドにあり、UI スレッドを一時停止するべきではないと思います。

なぜこれが起こり、どうすれば修正できますか?

レシーバーの私の httpconnection:

private Object callWebServiceMethodPublic(String url,
            String namespace, String methodName,
            HashMap<String, Object> parameters, String soapAction)
            throws Exception {

        //System.setProperty("http.keepAlive", "false");

        Log.i("WebService", "URL: " + url);
        Log.i("WebService", "MethodName: " + methodName);

        Log.i("SendMapMovements", "1.2.3.1");

        URL myurl = new URL(url);
        URLConnection connection = myurl.openConnection();
        connection.setConnectTimeout(20 * 1000);
        //connection.setRequestProperty("Connection", "close");

        HttpURLConnection httpConnection = (HttpURLConnection) connection;

        Log.i("SendMapMovements", "1.2.3.2");

        int responseCode = -1;
        try {
            responseCode = httpConnection.getResponseCode();

            Log.i("SendMapMovements", "1.2.3.3");

        } catch (Exception e1) {
            if (e1.toString().contains("Network is unreachable")) {

            } else if (e1.toString().contains("SocketTimeoutException")) {

            } else {
                throw e1;
            }
        }
        if (responseCode == HttpURLConnection.HTTP_OK) {
            httpConnection.disconnect();

            Log.i("SendMapMovements", "1.2.3.4");

            SoapObject request = new SoapObject(namespace, methodName);

            if (parameters != null) {
                String[] keys = new String[0];
                keys = (String[]) parameters.keySet().toArray(keys);
                Object[] vals = (Object[]) parameters.values().toArray();

                for (int i = 0; i < parameters.size(); i++) {
                    request.addProperty(keys[i], vals[i]);
                    Log.i("WebService", keys[i] + ": " + vals[i]);
                }
            }

            Log.i("SendMapMovements", "1.2.3.5");

            SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                    SoapEnvelope.VER11);
            envelope.dotNet = true;

            envelope.setOutputSoapObject(request);
            HttpTransportSE androidHttpTransport = new HttpTransportSE(url,
                    TimeOutInSeconds * 1000);

            Log.i("SendMapMovements", "1.2.3.6");

            try {
                androidHttpTransport.call(soapAction, envelope);

                Log.i("SendMapMovements", "1.2.3.7");

            } catch (Exception e) {
                if (e.toString().contains("XmlPullParserException")) {
                    throw new Exception(...);
                }
            }

            Object so = envelope.getResponse();
            System.gc();

            return so;

        } else {
            httpConnection.disconnect();
            Log.i("SendMapMovements", "1.2.3.8");
            String strErrorDescription = getHttpErrorDescription(responseCode);
            throw new Exception(strErrorDescription);
        }
    }
4

1 に答える 1

1

と yourは同じスレッドで実行されるため、Threadon ではなくnew 内で接続コードを実行する必要があります。UI Thread (Main Thread)BroadcastReceiverActivity

于 2012-11-11T07:20:35.213 に答える