正如标题所说,我在AsyncTask中的“doInBackground”中有代码。 代码从Internet读取文本;但是,如果出现问题(例如,连接不可用),它应该表明这种情况。使用易失性变量(并且正在工作)将状态标记到另一个线程,运行Timer。
现在,问题:在调用“urlConnection.connect()”时,函数结束(在调试器中看到)。应用程序报告字符串“Fase 3”,但变量为“lendoInternet”或“contador”(易失性的)保持不变 - 没有异常捕获(!)。另一方面,如果我使用字符串“abracadabra”作为(坏的)URL,则抛出异常。
我的理论:调用“urlConnection.connect();”将AsyncTask发送给Jupiter;我的意思是,它崩溃得如此之难以至于即使异常处理也没有得到尊重(但是:Timer线程继续更新UI)。是的,愚蠢的理论,但我在这里需要一些亮点。
这个东西在Android Studio中启动的模拟器中运行。顺便说一句,在最后一个街区,葡萄牙语中的字符串意思是“嘿,Java,你的母亲做得好吗?”,表明我对这种可爱的编程语言的温柔(用你喜欢的德语诅咒取而代之)。
谢谢你们。
lendoInternet = true;
erroInternet = false;
try {
URL url = new URL("https://www-eng-x.llnl.gov/documents/a_document.txt"); result = "-Fase-2-";
//URL url = new URL("abracadabra"); result = "-Fase-2-";
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); result = "-Fase-3-";
urlConnection.connect(); result = "-Fase-4-";
InputStream is = new BufferedInputStream(urlConnection.getInputStream()); result = "-Fase-5-";
BufferedReader r = new BufferedReader(new InputStreamReader(is)); result = "-Fase-6-";
StringBuilder total = new StringBuilder();
String line;
while ((line = r.readLine()) != null) {
total.append(line).append('\n');
}
result = total.toString();
} catch (IOException t) {
contador = 1;
lendoInternet = false;
erroInternet = true;
} catch (Throwable t) {
contador = 1;
lendoInternet = false;
erroInternet = true;
}
finally {
result = "Sua maezinha vai bem, Java?";
}
答案 0 :(得分:0)
我认为urlConnection.connect()
之后的代码可能会被优化,因为您为result
块中的变量finally
分配了定义的值。
答案 1 :(得分:0)
事实证明,问题在于等待异常。我会解释一下。
代码在尝试连接时被冻结(计算机在代理后面);通过设置短暂超时,例如:
urlConnection.setConnectTimeout(3000);
并等待它,瞧,代码按预期工作。
现在,什么是默认超时?这里的测试执行了10秒,没有运气;根据{{3}},默认超时可能是无限的。
感谢您的评论和想法。