2012-11-11 1 views
0

내 Android 애플리케이션에 BroadcastReceiver이 있습니다. 시작할 때마다 수신기를 주기적으로 10 분마다 호출하기 위해 AlarmManager을 가진 Service을 시작하고 수신기는 http 연결을 시도합니다. 수신기가 httpConnection을 만들려고 할 때 가끔씩 httpConnection.getResponseCode(); 또는 androidHttpTransport.call(soapAction, envelope);에 시간이 걸리고 이러한 상황에서 안드로이드 UI (Activity)가 멈추고 수신기 동작이 완료 될 때까지 대기합니다. 하지만 BroadcastReceiver의 작업은 별도의 스레드에 있다고 생각하며 UI 스레드를 일시 중지해서는 안됩니다.BroadcastReceiver가 httpConnection을 만들려고 할 때 Android 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); 
     } 
    } 
+0

*하지만 BroadcastReceiver의 작업이 별도의 스레드에 있고 UI 스레드를 일시 중지해서는 안된다고 생각합니다. * - 가정이 잘못되었습니다. – Luksprog

+0

@Luksprog 수신기에서 AsyncTask를 정의해야합니까? – breceivemail

+0

리시버가 매니페스트에 설정된 경우 안드로이드는'onReceive'가 끝난 후에 프로세스를 죽일 수 있으므로 새로운 스레드 또는 'AsyncTask'를 시작하면 안됩니다. 이 경우'Service' (또는 더 나은'IntentService')를 사용해야합니다. – Luksprog

답변

1

당신은하지 UI Thread (Main Thread) 새로운 Thread을, 이내에서 연결 코드를 실행해야합니다 BroadcastReceiver과 동일한 스레드에 당신의 Activity 실행하기 때문이다.

+0

내 수신기에 AsyncTask를 정의해야합니까? – breceivemail

+0

코드를 보았을 때 AsyncTask에서 코드를 수행 할 필요가 없습니다. 단지 새로운 스레드에서만 수행하십시오. –

관련 문제