2016-09-14 2 views
2

내 서버에 연결되어 AsyncTask 있습니다.서비스에서 안드로이드 AsyncTask (수신기에서 시작) 호스트를 확인할 수 없습니다

Activity에서 실행하면 모든 것이 잘 작동합니다.

그러나이 onReceive() 내부 BroadcastReceiver에서 시작 응용 프로그램이 배경에있을 때 - 항상 Exception 발생 :
Unable to resolve host *myHostHere* No address associated with hostname

응용 프로그램이 포 그라운드에있는 - 모든도 좋다.

어디서 실수 했습니까?

1.onReceive() 코드 :

new SendMessageAsync(context, this).execute(json); 

3.doInBackground() : sendData()에서

@Override 
    public void onReceive(final Context context, Intent intent) { 
     ExecutorService service = Executors.newSingleThreadExecutor(); 
     service.execute(new Runnable() { 

      @Override 
      public void run() { 
       try { 
        MonitoringHelper.getInstance(context).sendData(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

2 나는 함께 AsyncTask를 실행

01,238,419,474,271,328,513,271,832 10

로그 캣 4 :

09-14 10:58:05.684 16024-25007/com.hys.behappy W/System.err: java.net.UnknownHostException: Unable to resolve host "myHostHere": No address associated with hostname 
09-14 10:58:05.684 16024-25007/com.hys.behappy W/System.err:  at java.net.InetAddress.lookupHostByName(InetAddress.java:457) 
09-14 10:58:05.684 16024-25007/com.hys.behappy W/System.err:  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252) 
09-14 10:58:05.684 16024-25007/com.hys.behappy W/System.err:  at java.net.InetAddress.getAllByName(InetAddress.java:215) 
09-14 10:58:05.684 16024-25007/com.hys.behappy W/System.err:  at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:142) 
09-14 10:58:05.684 16024-25007/com.hys.behappy W/System.err:  at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:169) 
09-14 10:58:05.684 16024-25007/com.hys.behappy W/System.err:  at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:124) 
09-14 10:58:05.684 16024-25007/com.hys.behappy W/System.err:  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:369) 
09-14 10:58:05.684 16024-25007/com.hys.behappy W/System.err:  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:560) 
09-14 10:58:05.684 16024-25007/com.hys.behappy W/System.err:  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:492) 
09-14 10:58:05.684 16024-25007/com.hys.behappy W/System.err:  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:470) 
09-14 10:58:05.684 16024-25007/com.hys.behappy W/System.err:  at com.hys.behappy.utils.SendMessageAsync.doInBackground(SendMessageAsync.java:65) 
09-14 10:58:05.684 16024-25007/com.hys.behappy W/System.err:  at com.hys.behappy.utils.SendMessageAsync.doInBackground(SendMessageAsync.java:27) 
09-14 10:58:05.684 16024-25007/com.hys.behappy W/System.err:  at android.os.AsyncTask$2.call(AsyncTask.java:292) 
09-14 10:58:05.684 16024-25007/com.hys.behappy W/System.err:  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
09-14 10:58:05.684 16024-25007/com.hys.behappy W/System.err:  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
09-14 10:58:05.684 16024-25007/com.hys.behappy W/System.err:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
09-14 10:58:05.684 16024-25007/com.hys.behappy W/System.err:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
09-14 10:58:05.684 16024-25007/com.hys.behappy W/System.err:  at java.lang.Thread.run(Thread.java:818) 
09-14 10:58:05.684 16024-25007/com.hys.behappy W/System.err: Caused by: android.system.GaiException: android_getaddrinfo failed: EAI_NODATA (No address associated with hostname) 
09-14 10:58:05.684 16024-25007/com.hys.behappy W/System.err:  at libcore.io.Posix.android_getaddrinfo(Native Method) 
09-14 10:58:05.684 16024-25007/com.hys.behappy W/System.err:  at libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:55) 
09-14 10:58:05.684 16024-25007/com.hys.behappy W/System.err:  at java.net.InetAddress.lookupHostByName(InetAddress.java:438) 

PS.

<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> 

PPS 매니페스트

에서 권한.
AsyncTask를 IntentService로 이동했습니다.
결과는 같습니다.

PPPS. Xiaomi Redmi Note 3 Pro에서는 작동하지 않지만 LGE Nexus에서는 매력적으로 작용합니다.
조언이 있으십니까?

+0

코드를 공유하십시오. – Hemina

+1

* LogCat * 공유를 고려하십시오. – CodeWalker

+1

'호스트를 확인할 수 없습니다. '는 대개 ​​서버가 다운되었음을 의미합니다. –

답변

1

는 잘 모르겠어요.

기본적으로 Xiaomi는 가능한 모든 백그라운드 활동을 제한하며 모든 앱 또는 일부 특정 앱에 대해 실제로 비활성화 할 수 있습니다.

사실 제한은 실제로 인터넷에 연결되어 있지 않기 때문에 UnknownHostException을 얻을 수 있도록 백그라운드에있을 때 앱의 인터넷 연결을 제한한다는 점에서 다릅니다.

이 문제를 해결하려면 설정 -> '배터리 & 성능'-> '앱 배터리 사용 관리'로 이동 한 다음 모든 앱에서 완전히 끄거나 '앱 선택'을 클릭 한 다음 앱.

희망이 있습니다.

+0

불행히도 오래 전부터 확인해 보지 못했습니다.) 그러나 어쨌든 당신은 Xiaomi에 대해 옳았으며, 또한 발견했습니다. 그래서 나는 그것이 정말로 이유라고 생각합니다! –

1

BroadcastReceiver의 수명은 매우 짧습니다 (onReceive() 방법). 그 후에 그것은 파괴 될 것입니다 (Activity에 의해 등록되지 않았다면). 보조 인스턴스를 생성하여 일부 정적 인스턴스 클래스를 통해 AsyncTask을 시작하더라도, 이것은 앱의 수명주기 또는 전원 관리에 아무런 영향을 미치지 않습니다. 일반적으로 좋은 생각은 아닙니다. 유일한 구성 요소가 BroadcastReceiver이고 매니페스트에 등록 된 Intent에 의해 실행되면 앱이 실제로 종료 될 수 있습니다.

장치가 유휴 상태 일 때 (화면 꺼짐) 낮은 전력 상태로 들어가려고 시도합니다. Marshmallow를 켜면 그 전에도 으로 갈 수 있으며 이로 인해 네트워킹과 같은 서비스가 부분적으로 중단됩니다. 중고 마시맬로 장치에서는 WakefulBroadcastReceiver을 사용하여 서비스를 시작하고 wakelock을 사용할 수 있습니다. 그런 다음, 귀하의 서비스에서 일부 작업을 수행하고 완료되면 wakelock을 해제하십시오. 그러나 Marshmallow로 시작하여 Doze 모드는 이것에 영향을 미치고 모든 wakelock이 무시되도록합니다.

또한 AsyncTask이 어떻게 생성되고 시작되는지 살펴볼 수 있습니다.

스레딩 규칙이 클래스가 제대로 작동하기 위해 반드시 따라야하는 몇 스레딩 규칙이 있습니다

를 :가 만든 주 스레드에서 시작해야합니다 제한이

  • AsyncTask 클래스는 UI 스레드에로드해야합니다. 이것은 JELLY_BEAN부터 자동으로 수행됩니다.

  • 작업 인스턴스는 UI 스레드에서 만들어야합니다.

  • 실행 (Params ...)은 UI 스레드에서 호출해야합니다. 이 여전히 활성화되어 있지만이 같은 문제가 없었다 및 해결책을 찾기 위해 관리 한 경우

...

+0

변경되었지만 운이 없습니다. Pls 편집 된 답변을 참조하십시오. –

+0

흥미로운 것은 장치마다 다릅니다. 'HttpClient' 대신'HttpURLConnection'을 사용해 볼 수도 있습니다. 'HttpClient'에는 몇 가지 크기와 성능 문제가 있습니다. Froyo 이전 버전을 지원하는 장치를 지원하는 경우에만 좋은 선택입니다. 장치 제조업체가 아파치 http 클라이언트 코드에 뭔가를 한 것일 수도 있습니다. –

관련 문제