Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
来自服务的Android AsyncTask(从接收器启动)无法解析主机_Android_Android Asynctask_Android Broadcastreceiver - Fatal编程技术网

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

来自服务的Android AsyncTask(从接收器启动)无法解析主机,android,android-asynctask,android-broadcastreceiver,Android,Android Asynctask,Android Broadcastreceiver,我有一个异步任务,正在连接到我的服务器 当我从活动运行它时——一切正常 但是当它从BroadcastReceiver内部onReceive()启动并且应用程序处于后台时-它总是抛出异常: 无法解析主机*myHostHere*没有与主机名关联的地址 当应用程序处于前台时,一切都很好 我哪里出错了 1.onReceive()code: @Override public void onReceive(final Context context, Intent intent) {

我有一个
异步任务
,正在连接到我的服务器

当我从
活动运行它时
——一切正常

但是当它从
BroadcastReceiver
内部
onReceive()
启动并且应用程序处于后台时
-它总是抛出
异常

无法解析主机*myHostHere*没有与主机名关联的地址

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

我哪里出错了

1.
onReceive()
code:

@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()

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。
结果相同


购买力平价。似乎是一个很好的设备特定问题-它在小米Redmi Note 3 Pro上不起作用,但在LGE Nexus上却像charm一样起作用。
有什么建议吗?

A
BroadcastReceiver
的寿命很短-只有
onReceive()
方法。在此之后,它将被销毁(除非它是由
活动注册的
),即使您正在创建一个辅助线程,然后通过某个静态实例类启动
异步任务
,这对应用程序的生命周期或电源管理没有影响,通常也不是一个好主意。如果唯一的组件是由清单中注册的
意图触发的
BroadcastReceiver
,那么您的应用程序实际上可能会被终止

当设备空闲(屏幕关闭)时,它将尝试进入低功率状态。有了棉花糖,它也可以进入之前,这导致部分退出服务,如网络。在棉花糖上市前的设备上,您可以使用WakefulBroadcastReceiver启动服务并使用wakelock。然后,在您的服务中做一些工作,完成后释放wakelock。但是,从棉花糖开始,打盹模式会影响这一点,并导致忽略所有唤醒锁

此外,您可能还想看看您的
AsyncTask
是如何创建和启动的;必须在主线程上创建和启动它有一些限制:

线程规则

要使此类正常工作,必须遵循以下几个线程规则:

  • 必须在UI线程上加载AsyncTask类。这是自动完成作为果冻豆

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

  • 必须在UI线程上调用execute(参数…)


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

默认情况下,小米会在可能的情况下限制所有后台活动,您可以对所有应用或某些特定应用禁用这些活动

限制的实际作用是,当你的应用程序处于后台时,它会限制你的应用程序的互联网连接,这样你就不知道为什么会出现这种情况,因为它实际上没有互联网连接

因此,要解决此问题,只需进入设置->“电池和性能”->“管理应用程序电池使用情况”并完全关闭所有应用程序,或单击“选择应用程序”并仅关闭应用程序


希望有帮助

共享您的代码考虑共享您的日志猫。
无法解析主机
通常意味着服务器已关闭并添加了日志猫@Aman Grover-不,它总是发生在应用程序位于后台的情况下。您在清单中是否具有internet权限?或者正确检查您的网络连接!!有趣的是,它是特定于设备的。您可能希望尝试使用
HttpURLConnection
而不是
HttpClient
HttpClient
存在一些大小和性能问题,只有当您支持运行Froyo或更早版本的设备时,才认为它是一个不错的选择。可能是设备制造商对apache http客户端代码做了一些破坏。不幸的是,我无法检查它,因为那是很久以前的事了)但不管怎样,你对小米的看法是对的,我也发现了它。所以我认为这真的可能是一个原因!
<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"/>