내 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);
}
}
*하지만 BroadcastReceiver의 작업이 별도의 스레드에 있고 UI 스레드를 일시 중지해서는 안된다고 생각합니다. * - 가정이 잘못되었습니다. – Luksprog
@Luksprog 수신기에서 AsyncTask를 정의해야합니까? – breceivemail
리시버가 매니페스트에 설정된 경우 안드로이드는'onReceive'가 끝난 후에 프로세스를 죽일 수 있으므로 새로운 스레드 또는 'AsyncTask'를 시작하면 안됩니다. 이 경우'Service' (또는 더 나은'IntentService')를 사용해야합니다. – Luksprog