Android的Firestore超时

Was*_*Tea 5 java android firebase google-cloud-firestore

我目前正在构建一个将用户博客文章保存在Firestore服务器中的应用程序。一切正常,但我发现该帖子不是在不稳定的互联网连接下上传的。

我试图为实例设置超时Firestore,但是Firestore库似乎没有超时选项。问题是,因为没有超时设置,所以应用程序不知道何时关闭上载屏幕(“旋转程序”对话框)。

我正在考虑创建Handleror Observable或or Thread并手动设置超时。在指定的超时时间后,让该应用关闭上载屏幕。但是,即使超时后,Firestore客户端也将继续在后台重试上载。因此,这种方法不适用于这种情况...

有什么解决办法吗?如果可以为Firestore客户端本身设置超时,即让客户端onFailure()在给定的超时时间后调用,我可以将帖子另存为草稿,保存在本地存储中,然后在设备恢复稳定连接后重试。

Gas*_*lén 2

最好的方法是附加一个布尔值,让您在做某事之前知道是否有互联网(这只是为了关闭您的微调器,因为 firestore 具有实时数据库等离线功能)

public static boolean hasActiveInternetConnection(Context context) {
    if (isNetworkAvailable(context)) {
        try {
            HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.google.com").openConnection());
            urlc.setRequestProperty("User-Agent", "Test");
            urlc.setRequestProperty("Connection", "close");
            urlc.setConnectTimeout(1500); 
            urlc.connect();
            return (urlc.getResponseCode() == 200);
        } catch (IOException e) {
            Log.e(LOG_TAG, "Error checking internet connection", e);
        }
    } else {
        Log.d(LOG_TAG, "No network available!");
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

因此,您应该首先检查是否有活动连接,此方法将 ping google.com 并检查互联网连接,如果 1.5 秒后无法访问,则会返回 false

所以你应该做这样的事情(伪代码)

if(hasActiveInternetConnection)
doyourfirebaseuploadstuff
else
spinner.dismiss()
Toast(please check your internet connection and try again)
Run Code Online (Sandbox Code Playgroud)

请记住在清单中添加您的互联网权限

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
Run Code Online (Sandbox Code Playgroud)

编辑:

另一种很酷的方法,也许对某些人来说更具可读性,就是这个

public boolean isInternetWorking() {
    boolean success = false;
    try {
        URL url = new URL("https://google.com");
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setConnectTimeout(10000);
        connection.connect();
        success = connection.getResponseCode() == 200;
    } catch (IOException e) {
        e.printStackTrace();
    }
    return success;
}
Run Code Online (Sandbox Code Playgroud)

它的工作原理与另一个类似,只是等待 10 秒,直到返回互联网状态


归档时间:

查看次数:

2005 次

最近记录:

7 年,6 月 前