我不确定如何为这个问题加上好标题。
我的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检测某些通知的语言。
detect
字符串是局部变量,Translator
类在其他任何地方均未引用。首先,我认为它可能仍会被引用,因为我将Translator类用作字段。但是,即使将翻译器移至本地电话后,问题仍然浮出水面。
当连接失败时,我注意到的是URL抛出并未能连接到错误:https://www.bing.com/204.79.197.200:443
,这实际上不是我用来进行呼叫的URL字符串。
是我遗漏了明显的内容还是这可能是Android中的错误?
作为脚注问题,是否有任何其他建议来进行http调用?我查看了Volley,但它可用于回调,而且我不太想更改整个应用程序以适应这种情况。
更新
我现在已经更改了代码,并切换到Volley,即使经过3天,它似乎仍然可以正常工作,到目前为止,效果很好,但问题仍然是为什么简单的Https连接一段时间后会失败?我只是无法弄清楚...
答案 0 :(得分:0)
考虑到您的问题,我假设您希望该服务无限运行,但是该服务仅运行一天并引发异常。 由于Android团队引入了一些限制,因此我认为Android操作系统会限制您的服务长时间运行。您的服务不能长时间运行,因为这种长时间运行的服务会消耗大量电池和Android CPU资源。 如果您正在使用后台服务,那么这对于实施长期运行的服务不是一个合适的解决方案,那么我建议您使用前景服务,然后让该应用显示一个通知,这不会让Android OS破坏您的服务。 希望这会有所帮助。