gpt4 book ai didi

Android 继续尝试 POST 直到它通过

转载 作者:行者123 更新时间:2023-12-04 07:56:42 25 4
gpt4 key购买 nike

我有一条 POST 消息,我绝对必须在给定的情况下在 Android 上发送,以至于我希望它继续尝试直到它完成。我的理解是设置:

urlConnection.setConnectTimeout(0);
将继续尝试连接直到它通过,但实际发生的是 try block 失败,而是抛出 UnknownHostException:
private class SendAlert extends AsyncTask<String, String, String> { 
protected String doInBackground(String... strings) {
Log.d(TAG, "sendAlarm: sending alarm");
String stringUrl = createUri();
HttpsURLConnection urlConnection = null;
BufferedReader reader = null;

String postData = "";
Log.d(TAG, "sendAlarm: apikey: " + apiKey);
try{
Log.d(TAG, "sendAlarm: trying");
URL finalURL = new URL(stringUrl);
urlConnection = (HttpsURLConnection)finalURL.openConnection();
urlConnection.setReadTimeout(10000);
urlConnection.setConnectTimeout(0);
urlConnection.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
urlConnection.setRequestProperty("Accept","application/json");
urlConnection.setRequestProperty("x-api-key",apiKey);
urlConnection.setRequestMethod("POST");
urlConnection.setDoInput(true);
urlConnection.setDoOutput(true);

int responseCode = urlConnection.getResponseCode();
Log.d(TAG, "doInBackground: response code = " + responseCode);

}catch (MalformedURLException e) {
e.printStackTrace();
Log.d(TAG, "doInBackground: error 1 " + e.toString());
}catch(UnknownHostException e){
Log.d(TAG, "doInBackground: e: " + e);
Log.d(TAG, "doInBackground: retrying");
}

catch(Exception e){
Log.d(TAG, "doInBackground: error 2 " + e.toString());
}
想知道在 Android 上设置发布消息的最佳方式是什么,即使手机处于飞行模式 5 小时,也要继续尝试连接直到连接成功。
编辑:下面@user3252344的回答,直接在AyncTask的catch block 中再次调用函数有什么问题:
catch(UnknownHostException e){
Log.d(TAG, "doInBackground: e: " + e);
Log.d(TAG, "doInBackground: retrying");
SendAlarm sendAlarm = new SendAlarm;
sendAlarm.execute();
}

最佳答案

将连接超时设置为 0 将意味着它不会超时,但如果连接失败,它将无法继续处理。我猜你会得到一个 UnknownHostException因为它无法解析 url,因为它无法访问 DNS 服务器。
我建议您设置一个合理的连接超时,如果发生超时异常并重新运行。

final int READ_TIMEOUT = 500; // Timeout
final int RETRY_MS = 2000; //Retry every 2 seconds
final Handler handler = new Handler();

Runnable myUrlCall = () -> {
try {
//Make things
urlConnect.setReadTimeout(READ_TIMEOUT);
//Make the URL call, do response
} catch (SocketTimeoutException e) {
handler.postDelayed(myUrlCall, RETRY_MS);
} catch (/* other unintended errors*/ e) {
//Log the error or alert the user
}
};

handler.post(myUrlCall);

可能更好的主意:在调用电话之前使用 Android 设置检查是否有互联网。如果没有互联网,请使用更长的延迟时间。 Something like this would be the code you're looking for .

关于Android 继续尝试 POST 直到它通过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66665059/

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