来自Service的Android AsyncTask(从接收器启动)无法解析主机

时间:2016-09-14 07:26:25

标签: android android-asynctask android-broadcastreceiver

我有一个AsyncTask,连接到我的服务器。

当我从Activity运行时 - 一切正常。

但是当它从BroadcastReceiver onReceive()开始,而应用程序在后台时 - 它始终会抛出Exception
Unable to resolve host *myHostHere* No address associated with hostname

当应用程序处于前台时 - 一切都很好。

我在哪里弄错了?

1。 onReceive()代码:

@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。sendData()中我运行AsyncTask:

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

3。 doInBackground()

@Override
    protected Boolean doInBackground(String ... params) {
        HttpPost httpPost = new HttpPost("http://" + serverAddress.replace("http://", "") + "/mobile/message");
        httpPost.setHeader("Content-type", "application/json");

        HttpClient client = new DefaultHttpClient();
        HttpResponse response;
        StringBuilder stringBuilder = new StringBuilder();

        try {
            httpPost.setEntity(new StringEntity(params[0]));
            response = client.execute(httpPost);
            HttpEntity entity = response.getEntity();
            InputStream stream = entity.getContent();
            int b;
            while ((b = stream.read()) != -1) {
                stringBuilder.append((char) b);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return true;
    }

4. Logcat:

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。似乎是特定于设备的特定问题 - 它不适用于小米Redmi Note 3 Pro,但在LGE Nexus上的功能就像魅力一样。
任何建议?

2 个答案:

答案 0 :(得分:1)

BroadcastReceiver的生命周期很短 - 只有onReceive()方法。之后它将被销毁(除非它是由Activity注册的。)即使您正在创建一个辅助线程然后通过一些静态实例类启动AsyncTask,这将对您的应用程序的生命周期或电源管理通常不是一个好主意。如果唯一的组件是BroadcastReceiver,由清单中注册的Intent触发,那么您的应用实际上可能会被杀死。

当设备空闲(屏幕关闭)时,它将尝试进入低功耗状态。使用Marshmallow时,它也可以在此之前进入Doze Mode,这会导致部分丢失服务,例如网络。在Marshmallow之前的设备上,您可以使用WakefulBroadcastReceiver来启动服务并使用唤醒锁。然后,在您的服务中做一些工作并在完成后释放唤醒锁。但是,从Marshmallow开始,Doze模式会影响这一点并导致所有唤醒锁被忽略。

此外,您可能想了解如何创建和启动AsyncTask;必须在主线程上创建和启动它的限制:

  

线程规则

     

此类必须遵循一些线程规则才能正常工作:

     
      
  • 必须在UI线程上加载AsyncTask类。这是从JELLY_BEAN开始自动完成的。

  •   
  • 必须在UI线程上创建任务实例。

  •   必须在UI线程上调用
  • execute(Params ...)。

  •   
     

...

答案 1 :(得分:1)

我不确定这是否仍然有效,但我遇到了同样的问题并设法找到解决方案。

默认情况下,小米会尽可能限制所有背景活动,您实际上可以针对所有应用或某些特定应用禁用该功能。

实际上限制的是它限制了应用程序的互联网连接,因为它实际上没有互联网连接,因此你得到了UnknownHostException。

所以,要解决此问题,请转到设置 - &gt; “电池和性能” - &gt; “管理应用电池使用情况”并为所有应用完全关闭,或点击“选择应用”并仅为您的应用关闭它。

希望它有所帮助!