parse-community / Parse-SDK-Android

The Android SDK for Parse Platform
https://parseplatform.org/
Other
1.88k stars 735 forks source link

Crash when initializing SDK with unreachable server #1096

Open CapacitorSet opened 3 years ago

CapacitorSet commented 3 years ago

I'm having crashes when trying to initialize the SDK while the server was unreachable - in my case it was because I was accidentally using 4G while the Parse Server was on a local network, but of course it can happen if eg. the network connection is disabled.

The best course of action would be for Parse to start without a server and connect to it when possible, but I understand that it may be effectively impossible to do so. However, the problem is also that I can't "fail gracefully" by catching the exception, as it is thrown in a different thread.

Here is the code I used:

        try {
            val config = Parse.Configuration.Builder(this)
                .applicationId("foobar")
                .clientKey("")
                .server("http://192.168.1.5/parse/")
                .enableLocalDataStore()
                .maxRetries(1)
                .build()
            Parse.initialize(config)
        } catch (e: Exception) {
            print(e)
        }

And the stack trace:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: <app name>, PID: 19637
    java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:610)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967)
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:600)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967) 
     Caused by: com.parse.ParseRequest$ParseRequestException: i/o failure
        at com.parse.ParseRequest.newTemporaryException(ParseRequest.java:288)
        at com.parse.ParseRequest$2.then(ParseRequest.java:142)
        at com.parse.ParseRequest$2.then(ParseRequest.java:136)
        at com.parse.boltsinternal.Task$15.run(Task.java:907)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:923)
     Caused by: java.net.SocketTimeoutException: failed to connect to /192.168.1.5 (port 1337) from /10.79.239.118 (port 47550) after 10000ms
        at libcore.io.IoBridge.connectErrno(IoBridge.java:190)
        at libcore.io.IoBridge.connect(IoBridge.java:134)
        at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:142)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:390)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:436)
        at java.net.Socket.connect(Socket.java:621)
        at okhttp3.internal.platform.AndroidPlatform.connectSocket(AndroidPlatform.java:73)
        at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.java:247)
        at okhttp3.internal.connection.RealConnection.connect(RealConnection.java:167)
        at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:258)
        at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:135)
        at okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:114)
        at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
        at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
        at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
        at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:127)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
        at com.parse.ParsePlugins$1.intercept(ParsePlugins.java:142)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
        at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:257)
        at okhttp3.RealCall.execute(RealCall.java:93)
        at com.parse.ParseHttpClient.executeInternal(ParseHttpClient.java:71)
        at com.parse.ParseHttpClient.execute(ParseHttpClient.java:57)
        at com.parse.ParseRequest$3.then(ParseRequest.java:133)
        at com.parse.ParseRequest$3.then(ParseRequest.java:130)
        at com.parse.boltsinternal.Task$15.run(Task.java:907)
        at com.parse.boltsinternal.BoltsExecutors$ImmediateExecutor.execute(BoltsExecutors.java:113)
        at com.parse.boltsinternal.Task.completeAfterTask(Task.java:898)
        at com.parse.boltsinternal.Task.continueWithTask(Task.java:713)
        at com.parse.boltsinternal.Task.continueWithTask(Task.java:724)
        at com.parse.boltsinternal.Task$13.then(Task.java:816)
        at com.parse.boltsinternal.Task$13.then(Task.java:804)
            ... 4 more