Android URL在服务运行较长时间后不会连接
作者:互联网
我不确定如何为这个问题打好标题.
我在Android应用中有以下课程:
class Translator {
public Translator() {
}
public String bingTranslate(String text) throws IOException {
String response;
String textEncoded= URLEncoder.encode(text, "utf-8");
String url = "https://www.bing.com/tdetect";
URL obj = new URL(url);
HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();
con.setRequestMethod("POST");
//con.setRequestProperty("User-Agent", USER_AGENT);
con.setRequestProperty("Accept-Language", "UTF-8");
con.setDoOutput(true);
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(con.getOutputStream());
outputStreamWriter.write("text="+textEncoded);
outputStreamWriter.flush();
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
response=in.readLine();
in.close();
con.disconnect();
return response;
}
}
而我这样称呼它:
detected = new Translator().bingTranslate(text.substring(0, Math.min(text.length(), 100)));
这工作绝对正常,但是在我的服务运行很长时间后(比如一天左右),URL无法连接,导致我无法连接错误.强制停止服务并重新启动它会使整个思考工作重新开始.
我的服务是扩展NotificationListenerService,因此它始终在运行,并尝试使用Bing来检测某些通知的语言.
检测字符串是局部变量,Translator类不会在其他任何地方引用.首先我认为它可能以某种方式保持引用,因为我使用Translator类作为字段.但即使将翻译器移动到本地呼叫之后,问题仍然重新出现.
当连接失败时我注意到,URL抛出并且无法连接到它的错误:https://www.bing.com/204.79.197.200:443这实际上不是我用来拨打电话的URL字符串.
我是否错过了明显的或者这可能是Android中的一个错误?
作为脚注问题,是否有任何关于进行http呼叫的替代方案的建议?我查看了Volley,但这适用于回调,我不太热衷于对我的整个应用程序进行更改以适应这种情况.
UPDATE
我现在已经改变了代码并切换到Volley,即使在3天之后似乎工作正常,到目前为止一直很好,但问题仍然是为什么简单的Https连接在一段时间后失败了?我只是无法搞清楚……
解决方法:
看看你的问题,我假设你希望服务无限运行,但它只运行一天并抛出异常.
由于Android团队引入了一些限制,我认为Android操作系统限制您的服务运行更长时间.您的服务无法运行更长的时间,因为这种长时间运行的服务将耗尽大量电池和Android CPU资源.
如果您使用后台服务,这不是实现长期运行服务的正确解决方案,我建议您使用Foreground服务并让应用程序显示一个通知,这不会让Android操作系统破坏您的服务.
希望这可以帮助.
标签:android,android-service,android-networking 来源: https://codeday.me/bug/20190710/1424428.html