2016-09-14 57 views
2

我有一個AsyncTask,連接到我的服務器。從服務的Android 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。似乎是一個偉大的設備特定問題 - 它不適用於小米紅米Note 3 Pro,但像LGE Nexus上的魅力。
任何建議?

+0

分享您的代碼 – Hemina

+1

請考慮分享您的* LogCat *。 – CodeWalker

+1

'無法解析主機'通常意味着服務器關閉 –

回答

1

我不知道這是否仍然有效,但我有同樣的問題,並設法找到解決辦法。

小米在默認情況下會限制所有後臺活動,您可以實際禁用所有應用程序或僅針對某些特定應用程序。

實際上限制的是它在您的應用程序停止後臺時限制互聯網連接,因此您得到UnknownHostException因爲它實際上沒有互聯網連接。

所以,要解決這個問題,只需進入設置 - >「電池&性能」 - >「管理應用程序電池使用情況」,並關閉所有應用程序的完全關閉或點擊「選擇應用程序」,並關閉只爲你的應用程序。

希望它有幫助!

+0

不幸的是,我不能檢查它,因爲它是很久以前)但是無論如何,你對小米是正確的,我也發現它。所以我認爲這可能是一個理由! –

1

A BroadcastReceiver有一個非常短的壽命 - 只是onReceive()方法。之後,它將被銷燬(除非它是由Activity註冊的)。即使您正在創建輔助線程,然後通過某個靜態實例類啓動AsyncTask,但這對您的應用的生命週期或電源管理沒有影響,並且一般不是一個好主意。如果唯一的組件是BroadcastReceiver,那麼您的應用程序實際上可能會被殺死,這是由在清單中註冊的Intent觸發的。

當設備空閒(屏幕關閉)時,它會嘗試進入低功耗狀態。隨着棉花糖開啓,它也可以在此之前進入Doze Mode,這導致服務的部分輟學,例如聯網。在棉花糖前的設備上,您可以使用WakefulBroadcastReceiver開始一項服務並採取喚醒方式。然後,在您的服務中做一些工作,並在完成後釋放喚醒鎖。然而,從棉花糖開始,打盹模式會影響這一點並導致所有的喚醒鎖被忽略。

此外,你可能想看看你的AsyncTask是如何被創建和啓動;有些情況下,必須創建並啓動主線程的限制:

線程規則

有必須遵循此類才能正常工作的幾個線程規則:

  • 必須在UI線程上加載AsyncTask類。這從JELLY_BEAN自動完成。

  • 任務實例必須在UI線程上創建。

  • execute(Params ...)必須在UI線程上調用。

...

+0

做了改變,但沒有運氣。請參閱編輯的答案。 –

+0

這很有趣,它是設備特定的。你可能想嘗試使用'HttpURLConnection'而不是'HttpClient'。 'HttpClient'有一些尺寸和性能問題,如果您支持運行Froyo或更早版本的設備,它只是一個很好的選擇。這可能是設備製造商對apache http客戶端代碼做了一些破解。 –

相關問題