gpt4 book ai didi

java - 在 android studio 中,当手机没有互联网时,如何防止缓冲读取器从 url 读取时出现错误

转载 作者:行者123 更新时间:2023-12-02 01:14:52 27 4
gpt4 key购买 nike

在我的应用程序中,当我按下按钮时,缓冲阅读器应该从在线文本文件中读取一行文本。

作为测试,如果文本读取正确,我希望出现一个 toast “成功”。如果读取失败,例如因为手机没有连接到互联网,我希望出现一个提示“失败”的消息。

但是,如果我打开飞行模式,然后按下按钮,它似乎永远“挂起”,并且“失败”的 toast 永远不会出现 - 或者它只会使应用程序完全崩溃。

这是我正在使用的代码:

    button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new NotePadFileFromServer().execute();
}
});

public class NotePadFileFromServer extends AsyncTask<Void, Void, Void>{

@Override
protected Void doInBackground(Void... params) {
try {
url = new URL(TextFileURL);
bufferReader = new BufferedReader(new InputStreamReader(url.openStream()));
TextHolder = bufferReader.readLine();
bufferReader.close();
} catch (Exception e) {
Toast.makeText(MainActivity.this, "Fail!", Toast.LENGTH_SHORT).show();
}
return null;
}

@Override
protected void onPostExecute(Void finalTextHolder) {
Toast.makeText(MainActivity.this, "Success!", Toast.LENGTH_SHORT).show();
super.onPostExecute(finalTextHolder);
}

}

我尝试使用 ConnectivityManager 添加预检查,以测试是否有互联网连接(按照以下代码):https://stackoverflow.com/a/58146646/4250107 ,但这只有在手机用户特意关闭互联网的情况下才有效,如果打开wifi功能但没有互联网,则会再次发生崩溃。然后我尝试检查互联网连接,按照以下代码:https://stackoverflow.com/a/58146896/4250107 ,但这也会使应用程序崩溃,因为显然(?)尝试 ping 服务器在三星手机上不起作用。

编辑:最终固定代码。

public class NotePadFileFromServer extends AsyncTask<Void, Void, String>{

@Override
protected String doInBackground(Void... params) {
try {
URLConnection url = new URL(TextFileURL).openConnection());
url.setConnectTimeout(1000);
url.setReadTimeout(1000);
bufferReader = new BufferedReader(new InputStreamReader(url.getInputStream()));
TextHolder = bufferReader.readLine();
bufferReader.close();
return "Success!";
} catch (Exception e) {
return "Fail!";
}
}

@Override
protected void onPostExecute(String success) {
Toast.makeText(MainActivity.this, success, Toast.LENGTH_SHORT).show();
super.onPostExecute(success);
}
}

最佳答案

应用程序崩溃是因为您在出现异常时尝试在后台线程中执行 UI 相关任务。因此,以下原因导致了崩溃,

catch (Exception e) {
Toast.makeText(MainActivity.this, "Fail!", Toast.LENGTH_SHORT).show();
}

因此,您可以通过以下方式重构代码来避免崩溃,

public class NotePadFileFromServer extends AsyncTask<Void, Void, String>{

@Override
protected String doInBackground(Void... params) {
try {
url = new URL(TextFileURL);
bufferReader = new BufferedReader(new InputStreamReader(url.openStream()));
TextHolder = bufferReader.readLine();
bufferReader.close();
return "Success!";
} catch (Exception e) {
return "Fail!";
}
}

@Override
protected void onPostExecute(String finalTextHolder) {
Toast.makeText(MainActivity.this, finalTextHolder, Toast.LENGTH_SHORT).show();
super.onPostExecute(finalTextHolder);
}

}

如果出现您在此处描述为挂起的超时问题,我建议您使用 openConnection() (返回 UrlConnection )而不是 openStream() 。这样您就可以设置更短的连接和读取超时。

关于java - 在 android studio 中,当手机没有互联网时,如何防止缓冲读取器从 url 读取时出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58827627/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com