Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
A
AloqaIM-Android
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
AloqaIM-Android
Commits
d9ecbea9
Commit
d9ecbea9
authored
Feb 06, 2017
by
Yusuke Iwaki
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix issue that getOrCreateWebSocket is unexpectedly called repeatedly.
parent
86adbe67
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
35 additions
and
24 deletions
+35
-24
RealmBasedConnectivityManager.java
...rocket/android/service/RealmBasedConnectivityManager.java
+28
-17
RocketChatService.java
...n/java/chat/rocket/android/service/RocketChatService.java
+1
-7
ServerConnectivity.java
.../java/chat/rocket/android/service/ServerConnectivity.java
+6
-0
No files found.
app/src/main/java/chat/rocket/android/service/RealmBasedConnectivityManager.java
View file @
d9ecbea9
...
@@ -64,9 +64,7 @@ import rx.subjects.PublishSubject;
...
@@ -64,9 +64,7 @@ import rx.subjects.PublishSubject;
@Override
@Override
public
void
ensureConnections
()
{
public
void
ensureConnections
()
{
for
(
String
hostname
:
serverConnectivityList
.
keySet
())
{
for
(
String
hostname
:
serverConnectivityList
.
keySet
())
{
connectToServer
(
hostname
)
//force connect.
connectToServerIfNeeded
(
hostname
,
true
/* force connect */
)
//.doOnError(RCLog::e)
.
retryWhen
(
RxHelper
.
exponentialBackoff
(
3
,
500
,
TimeUnit
.
MILLISECONDS
))
.
subscribe
(
_val
->
{
},
RCLog:
:
e
);
.
subscribe
(
_val
->
{
},
RCLog:
:
e
);
}
}
}
}
...
@@ -78,7 +76,7 @@ import rx.subjects.PublishSubject;
...
@@ -78,7 +76,7 @@ import rx.subjects.PublishSubject;
if
(!
serverConnectivityList
.
containsKey
(
hostname
))
{
if
(!
serverConnectivityList
.
containsKey
(
hostname
))
{
serverConnectivityList
.
put
(
hostname
,
ServerConnectivity
.
STATE_DISCONNECTED
);
serverConnectivityList
.
put
(
hostname
,
ServerConnectivity
.
STATE_DISCONNECTED
);
}
}
connectToServerIfNeeded
(
hostname
)
connectToServerIfNeeded
(
hostname
,
false
)
.
subscribe
(
_val
->
{
},
RCLog:
:
e
);
.
subscribe
(
_val
->
{
},
RCLog:
:
e
);
}
}
...
@@ -93,7 +91,7 @@ import rx.subjects.PublishSubject;
...
@@ -93,7 +91,7 @@ import rx.subjects.PublishSubject;
@Override
@Override
public
Single
<
Boolean
>
connect
(
String
hostname
)
{
public
Single
<
Boolean
>
connect
(
String
hostname
)
{
return
connectToServerIfNeeded
(
hostname
);
return
connectToServerIfNeeded
(
hostname
,
false
);
}
}
@Override
@Override
...
@@ -136,16 +134,16 @@ import rx.subjects.PublishSubject;
...
@@ -136,16 +134,16 @@ import rx.subjects.PublishSubject;
return
Observable
.
concat
(
Observable
.
from
(
getCurrentConnectivityList
()),
connectivitySubject
);
return
Observable
.
concat
(
Observable
.
from
(
getCurrentConnectivityList
()),
connectivitySubject
);
}
}
private
Single
<
Boolean
>
connectToServerIfNeeded
(
String
hostname
)
{
private
Single
<
Boolean
>
connectToServerIfNeeded
(
String
hostname
,
boolean
forceConnect
)
{
return
Single
.
defer
(()
->
{
return
Single
.
defer
(()
->
{
final
int
connectivity
=
serverConnectivityList
.
get
(
hostname
);
final
int
connectivity
=
serverConnectivityList
.
get
(
hostname
);
if
(
connectivity
==
ServerConnectivity
.
STATE_CONNECTED
)
{
if
(
!
forceConnect
&&
connectivity
==
ServerConnectivity
.
STATE_CONNECTED
)
{
return
Single
.
just
(
true
);
return
Single
.
just
(
true
);
}
}
if
(
connectivity
==
ServerConnectivity
.
STATE_DISCONNECTING
)
{
if
(
connectivity
==
ServerConnectivity
.
STATE_DISCONNECTING
)
{
return
waitForDisconnected
(
hostname
)
return
waitForDisconnected
(
hostname
)
.
flatMap
(
_val
->
connectToServerIfNeeded
(
hostname
));
.
flatMap
(
_val
->
connectToServerIfNeeded
(
hostname
,
forceConnect
));
}
}
if
(
connectivity
==
ServerConnectivity
.
STATE_CONNECTING
)
{
if
(
connectivity
==
ServerConnectivity
.
STATE_CONNECTING
)
{
...
@@ -167,6 +165,7 @@ import rx.subjects.PublishSubject;
...
@@ -167,6 +165,7 @@ import rx.subjects.PublishSubject;
if
(
connectivity
==
ServerConnectivity
.
STATE_CONNECTING
)
{
if
(
connectivity
==
ServerConnectivity
.
STATE_CONNECTING
)
{
return
waitForConnected
(
hostname
)
return
waitForConnected
(
hostname
)
.
onErrorReturn
(
err
->
true
)
.
flatMap
(
_val
->
disconnectFromServerIfNeeded
(
hostname
));
.
flatMap
(
_val
->
disconnectFromServerIfNeeded
(
hostname
));
}
}
...
@@ -183,28 +182,40 @@ import rx.subjects.PublishSubject;
...
@@ -183,28 +182,40 @@ import rx.subjects.PublishSubject;
private
Single
<
Boolean
>
waitForConnected
(
String
hostname
)
{
private
Single
<
Boolean
>
waitForConnected
(
String
hostname
)
{
return
connectivitySubject
return
connectivitySubject
.
filter
(
serverConnectivity
->
(
hostname
.
equals
(
serverConnectivity
.
hostname
)
.
filter
(
serverConnectivity
->
hostname
.
equals
(
serverConnectivity
.
hostname
))
&&
serverConnectivity
.
state
==
ServerConnectivity
.
STATE_CONNECTED
))
.
map
(
serverConnectivity
->
serverConnectivity
.
state
)
.
filter
(
state
->
state
==
ServerConnectivity
.
STATE_CONNECTED
||
state
==
ServerConnectivity
.
STATE_DISCONNECTED
)
.
first
()
.
first
()
.
map
(
serverConnectivity
->
true
)
.
toSingle
()
.
toSingle
();
.
flatMap
(
state
->
state
==
ServerConnectivity
.
STATE_CONNECTED
?
Single
.
just
(
true
)
:
Single
.
error
(
new
ServerConnectivity
.
Disconnected
()));
}
}
private
Single
<
Boolean
>
waitForDisconnected
(
String
hostname
)
{
private
Single
<
Boolean
>
waitForDisconnected
(
String
hostname
)
{
return
connectivitySubject
return
connectivitySubject
.
filter
(
serverConnectivity
->
(
hostname
.
equals
(
serverConnectivity
.
hostname
)
.
filter
(
serverConnectivity
->
hostname
.
equals
(
serverConnectivity
.
hostname
))
&&
serverConnectivity
.
state
==
ServerConnectivity
.
STATE_DISCONNECTED
))
.
map
(
serverConnectivity
->
serverConnectivity
.
state
)
.
filter
(
state
->
state
==
ServerConnectivity
.
STATE_DISCONNECTED
)
.
first
()
.
first
()
.
map
(
serverConnectivity
->
true
)
.
toSingle
(
)
.
toSingle
(
);
.
map
(
state
->
true
);
}
}
@DebugLog
private
Single
<
Boolean
>
connectToServer
(
String
hostname
)
{
private
Single
<
Boolean
>
connectToServer
(
String
hostname
)
{
return
Single
.
defer
(()
->
{
return
Single
.
defer
(()
->
{
if
(!
serverConnectivityList
.
containsKey
(
hostname
))
{
if
(!
serverConnectivityList
.
containsKey
(
hostname
))
{
return
Single
.
error
(
new
IllegalArgumentException
(
"hostname not found"
));
return
Single
.
error
(
new
IllegalArgumentException
(
"hostname not found"
));
}
}
if
(
serverConnectivityList
.
get
(
hostname
)
!=
ServerConnectivity
.
STATE_CONNECTED
)
{
// Mark as CONNECTING except for the case [forceConnect && connected] because
// webSocketThread#keepAlive doesn't notify ConnectionEstablished/Lost on reconnecting.
serverConnectivityList
.
put
(
hostname
,
ServerConnectivity
.
STATE_CONNECTING
);
serverConnectivityList
.
put
(
hostname
,
ServerConnectivity
.
STATE_CONNECTING
);
}
if
(
serviceInterface
!=
null
)
{
if
(
serviceInterface
!=
null
)
{
return
serviceInterface
.
ensureConnectionToServer
(
hostname
);
return
serviceInterface
.
ensureConnectionToServer
(
hostname
);
...
...
app/src/main/java/chat/rocket/android/service/RocketChatService.java
View file @
d9ecbea9
...
@@ -93,14 +93,8 @@ public class RocketChatService extends Service implements ConnectivityServiceInt
...
@@ -93,14 +93,8 @@ public class RocketChatService extends Service implements ConnectivityServiceInt
return
Single
.
defer
(()
->
{
return
Single
.
defer
(()
->
{
if
(
webSocketThreads
.
containsKey
(
hostname
))
{
if
(
webSocketThreads
.
containsKey
(
hostname
))
{
RocketChatWebSocketThread
thread
=
webSocketThreads
.
get
(
hostname
);
RocketChatWebSocketThread
thread
=
webSocketThreads
.
get
(
hostname
);
if
(
thread
!=
null
)
{
return
Single
.
just
(
thread
);
return
Single
.
just
(
thread
);
}
else
{
return
Observable
.
timer
(
1
,
TimeUnit
.
SECONDS
).
toSingle
()
.
flatMap
(
_val
->
getOrCreateWebSocketThread
(
hostname
));
}
}
}
webSocketThreads
.
put
(
hostname
,
null
);
return
RocketChatWebSocketThread
.
getStarted
(
getApplicationContext
(),
hostname
)
return
RocketChatWebSocketThread
.
getStarted
(
getApplicationContext
(),
hostname
)
.
doOnSuccess
(
thread
->
webSocketThreads
.
put
(
hostname
,
thread
));
.
doOnSuccess
(
thread
->
webSocketThreads
.
put
(
hostname
,
thread
));
});
});
...
...
app/src/main/java/chat/rocket/android/service/ServerConnectivity.java
View file @
d9ecbea9
...
@@ -16,4 +16,10 @@ public class ServerConnectivity {
...
@@ -16,4 +16,10 @@ public class ServerConnectivity {
this
.
hostname
=
hostname
;
this
.
hostname
=
hostname
;
this
.
state
=
state
;
this
.
state
=
state
;
}
}
public
static
class
Disconnected
extends
Exception
{
public
Disconnected
()
{
super
(
"Disconnected"
);
}
}
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment