Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
沉迷打码的小凳子
glide
提交
6614298e
G
glide
项目概览
沉迷打码的小凳子
/
glide
与 Fork 源项目一致
从无法访问的项目Fork
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
glide
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
6614298e
编写于
6月 26, 2014
作者:
S
Sam Judd
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Refactor request tracker out of lifecycle manager
上级
9facd739
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
267 addition
and
164 deletion
+267
-164
library/src/main/java/com/bumptech/glide/manager/LifecycleRequestManager.java
...a/com/bumptech/glide/manager/LifecycleRequestManager.java
+20
-41
library/src/main/java/com/bumptech/glide/manager/RequestTracker.java
.../main/java/com/bumptech/glide/manager/RequestTracker.java
+70
-0
library/src/test/java/com/bumptech/glide/manager/LifecycleRequestManagerTest.java
...m/bumptech/glide/manager/LifecycleRequestManagerTest.java
+25
-123
library/src/test/java/com/bumptech/glide/manager/RequestTrackerTest.java
...t/java/com/bumptech/glide/manager/RequestTrackerTest.java
+152
-0
未找到文件。
library/src/main/java/com/bumptech/glide/manager/LifecycleRequestManager.java
浏览文件 @
6614298e
...
...
@@ -3,74 +3,53 @@ package com.bumptech.glide.manager;
import
android.content.Context
;
import
com.bumptech.glide.request.Request
;
import
java.util.Collections
;
import
java.util.Set
;
import
java.util.WeakHashMap
;
class
LifecycleRequestManager
implements
RequestManager
{
class
LifecycleRequestManager
implements
RequestManager
,
ConnectivityMonitor
.
ConnectivityListener
{
// Most requests will be for views and will therefore be held strongly (and safely) by the view via the tag.
// However, a user can always pass in a different type of target which may end up not being strongly referenced even
// though the user still would like the request to finish. Weak references are therefore only really functional in
// this context for view targets. Despite the side affects, WeakReferences are still essentially required. A user
// can always make repeated requests into targets other than views, or use an activity manager in a fragment pager
// where holding strong references would steadily leak bitmaps and/or views.
private
final
Set
<
Request
>
requests
=
Collections
.
newSetFromMap
(
new
WeakHashMap
<
Request
,
Boolean
>());
private
final
ConnectivityMonitor
connectivityMonitor
;
private
final
RequestTracker
requestTracker
;
LifecycleRequestManager
(
Context
context
)
{
this
(
context
,
new
ConnectivityMonitorFactory
());
this
(
context
,
new
RequestTracker
(),
new
ConnectivityMonitorFactory
());
}
LifecycleRequestManager
(
Context
context
,
ConnectivityMonitorFactory
factory
)
{
this
.
connectivityMonitor
=
factory
.
build
(
context
,
this
);
LifecycleRequestManager
(
Context
context
,
RequestTracker
requestTracker
,
ConnectivityMonitorFactory
factory
)
{
this
.
requestTracker
=
requestTracker
;
this
.
connectivityMonitor
=
factory
.
build
(
context
,
new
RequestManagerConnectivityListener
());
connectivityMonitor
.
register
();
}
@Override
public
void
addRequest
(
Request
request
)
{
request
s
.
add
(
request
);
request
Tracker
.
addRequest
(
request
);
}
@Override
public
void
removeRequest
(
Request
request
)
{
request
s
.
remove
(
request
);
request
Tracker
.
removeRequest
(
request
);
}
public
void
onStart
()
{
void
onStart
()
{
// onStart might not be called because this object may be created after the fragment/activity's onStart method.
connectivityMonitor
.
register
();
for
(
Request
request
:
requests
)
{
if
(!
request
.
isComplete
()
&&
!
request
.
isRunning
())
{
request
.
run
();
}
}
requestTracker
.
resumeRequests
();
}
public
void
onStop
()
{
void
onStop
()
{
connectivityMonitor
.
unregister
();
for
(
Request
request
:
requests
)
{
if
(!
request
.
isComplete
()
&&
!
request
.
isFailed
())
{
request
.
clear
();
}
}
requestTracker
.
pauseRequests
();
}
public
void
onDestroy
()
{
for
(
Request
request
:
requests
)
{
request
.
clear
();
}
void
onDestroy
()
{
requestTracker
.
clearRequests
();
}
@Override
public
void
onConnectivityChanged
(
boolean
isConnected
)
{
for
(
Request
request
:
requests
)
{
if
(
request
.
isFailed
())
{
request
.
run
();
}
else
if
(!
request
.
isComplete
())
{
request
.
clear
();
request
.
run
();
private
class
RequestManagerConnectivityListener
implements
ConnectivityMonitor
.
ConnectivityListener
{
@Override
public
void
onConnectivityChanged
(
boolean
isConnected
)
{
if
(
isConnected
)
{
requestTracker
.
restartRequests
();
}
}
}
...
...
library/src/main/java/com/bumptech/glide/manager/RequestTracker.java
0 → 100644
浏览文件 @
6614298e
package
com.bumptech.glide.manager
;
import
com.bumptech.glide.request.Request
;
import
java.util.Collections
;
import
java.util.Set
;
import
java.util.WeakHashMap
;
public
class
RequestTracker
{
// Most requests will be for views and will therefore be held strongly (and safely) by the view via the tag.
// However, a user can always pass in a different type of target which may end up not being strongly referenced even
// though the user still would like the request to finish. Weak references are therefore only really functional in
// this context for view targets. Despite the side affects, WeakReferences are still essentially required. A user
// can always make repeated requests into targets other than views, or use an activity manager in a fragment pager
// where holding strong references would steadily leak bitmaps and/or views.
private
final
Set
<
Request
>
requests
=
Collections
.
newSetFromMap
(
new
WeakHashMap
<
Request
,
Boolean
>());
public
void
addRequest
(
Request
request
)
{
requests
.
add
(
request
);
}
public
void
removeRequest
(
Request
request
)
{
requests
.
remove
(
request
);
}
/**
* Stops any in progress requests.
*/
public
void
pauseRequests
()
{
for
(
Request
request
:
requests
)
{
if
(!
request
.
isComplete
()
&&
!
request
.
isFailed
())
{
request
.
clear
();
}
}
}
/**
* Starts any not yet completed or failed requests.
*/
public
void
resumeRequests
()
{
for
(
Request
request
:
requests
)
{
if
(!
request
.
isComplete
()
&&
!
request
.
isRunning
())
{
request
.
run
();
}
}
}
/**
* Cancels all requests and clears their resources.
*/
public
void
clearRequests
()
{
for
(
Request
request
:
requests
)
{
request
.
clear
();
}
}
/**
* Restarts failed requests and cancels and restarts in progress requests.
*/
public
void
restartRequests
()
{
for
(
Request
request
:
requests
)
{
if
(
request
.
isFailed
())
{
request
.
run
();
}
else
if
(!
request
.
isComplete
())
{
request
.
clear
();
request
.
run
();
}
}
}
}
library/src/test/java/com/bumptech/glide/manager/LifecycleRequestManagerTest.java
浏览文件 @
6614298e
package
com.bumptech.glide.manager
;
import
android.content.Context
;
import
com.bumptech.glide.request.Request
;
import
org.junit.Before
;
import
org.junit.Test
;
import
org.junit.runner.RunWith
;
import
org.mockito.invocation.InvocationOnMock
;
import
org.mockito.stubbing.Answer
;
import
org.robolectric.Robolectric
;
import
org.robolectric.RobolectricTestRunner
;
...
...
@@ -19,135 +20,45 @@ import static org.mockito.Mockito.when;
public
class
LifecycleRequestManagerTest
{
private
LifecycleRequestManager
manager
;
private
ConnectivityMonitor
connectivityMonitor
;
private
RequestTracker
requestTracker
;
private
ConnectivityMonitor
.
ConnectivityListener
connectivityListener
;
@Before
public
void
setUp
()
{
connectivityMonitor
=
mock
(
ConnectivityMonitor
.
class
);
ConnectivityMonitorFactory
factory
=
mock
(
ConnectivityMonitorFactory
.
class
);
when
(
factory
.
build
(
any
(
Context
.
class
),
any
(
ConnectivityMonitor
.
ConnectivityListener
.
class
)))
.
thenReturn
(
connectivityMonitor
);
manager
=
new
LifecycleRequestManager
(
Robolectric
.
application
,
factory
);
.
thenAnswer
(
new
Answer
<
Object
>()
{
@Override
public
Object
answer
(
InvocationOnMock
invocation
)
throws
Throwable
{
connectivityListener
=
(
ConnectivityMonitor
.
ConnectivityListener
)
invocation
.
getArguments
()[
1
];
return
connectivityMonitor
;
}
});
requestTracker
=
mock
(
RequestTracker
.
class
);
manager
=
new
LifecycleRequestManager
(
Robolectric
.
application
,
requestTracker
,
factory
);
}
@Test
public
void
test
Cancel
sRequestsOnStop
()
{
public
void
test
Pause
sRequestsOnStop
()
{
manager
.
onStart
();
Request
request
=
mock
(
Request
.
class
);
manager
.
addRequest
(
request
);
manager
.
onStop
();
verify
(
request
).
clear
();
verify
(
request
Tracker
).
pauseRequests
();
}
@Test
public
void
test
CanAddAndRemoveReques
t
()
{
public
void
test
ResumesRequestsOnStar
t
()
{
manager
.
onStart
();
Request
request
=
mock
(
Request
.
class
);
manager
.
addRequest
(
request
);
manager
.
removeRequest
(
request
);
manager
.
onStop
();
verify
(
request
,
never
()).
clear
();
}
@Test
public
void
testCanAddMultipleRequests
()
{
manager
.
onStart
();
Request
first
=
mock
(
Request
.
class
);
Request
second
=
mock
(
Request
.
class
);
manager
.
addRequest
(
first
);
manager
.
addRequest
(
second
);
manager
.
onStop
();
verify
(
first
).
clear
();
verify
(
second
).
clear
();
}
@Test
public
void
testDoesNotClearCompleteRequestsOnStop
()
{
manager
.
onStart
();
Request
request
=
mock
(
Request
.
class
);
when
(
request
.
isComplete
()).
thenReturn
(
true
);
manager
.
addRequest
(
request
);
manager
.
onStop
();
verify
(
request
,
never
()).
clear
();
}
@Test
public
void
testDoesNotClearFailedRequestsOnStop
()
{
manager
.
onStart
();
Request
request
=
mock
(
Request
.
class
);
when
(
request
.
isFailed
()).
thenReturn
(
true
);
manager
.
addRequest
(
request
);
manager
.
onStop
();
verify
(
request
,
never
()).
clear
();
}
@Test
public
void
testRestartsStoppedRequestOnStart
()
{
Request
request
=
mock
(
Request
.
class
);
manager
.
addRequest
(
request
);
manager
.
onStart
();
verify
(
request
).
run
();
verify
(
requestTracker
).
resumeRequests
();
}
@Test
public
void
testDoesNotRestartCompletedRequestsOnStart
()
{
Request
request
=
mock
(
Request
.
class
);
when
(
request
.
isComplete
()).
thenReturn
(
true
);
manager
.
addRequest
(
request
);
manager
.
onStart
();
verify
(
request
,
never
()).
run
();
}
@Test
public
void
testDoesRestartFailedRequestsOnStart
()
{
Request
request
=
mock
(
Request
.
class
);
when
(
request
.
isFailed
()).
thenReturn
(
true
);
manager
.
addRequest
(
request
);
manager
.
onStart
();
verify
(
request
).
run
();
}
@Test
public
void
testDoesNotStartStartedRequestsOnStart
()
{
Request
request
=
mock
(
Request
.
class
);
when
(
request
.
isRunning
()).
thenReturn
(
true
);
manager
.
addRequest
(
request
);
manager
.
onStart
();
verify
(
request
,
never
()).
run
();
}
@Test
public
void
testClearsAllRequestsOnDestroy
()
{
Request
first
=
mock
(
Request
.
class
);
Request
second
=
mock
(
Request
.
class
);
when
(
second
.
isComplete
()).
thenReturn
(
true
);
Request
third
=
mock
(
Request
.
class
);
when
(
third
.
isFailed
()).
thenReturn
(
true
);
manager
.
addRequest
(
first
);
manager
.
addRequest
(
second
);
manager
.
addRequest
(
third
);
public
void
testClearsRequestsOnDestroy
()
{
manager
.
onDestroy
();
verify
(
first
).
clear
();
verify
(
second
).
clear
();
verify
(
third
).
clear
();
verify
(
requestTracker
).
clearRequests
();
}
@Test
...
...
@@ -170,25 +81,16 @@ public class LifecycleRequestManagerTest {
}
@Test
public
void
testRestartsFailedRequestOnConnected
()
{
Request
request
=
mock
(
Request
.
class
);
when
(
request
.
isFailed
()).
thenReturn
(
true
);
manager
.
addRequest
(
request
);
manager
.
onConnectivityChanged
(
true
);
public
void
testRestartsRequestOnConnected
()
{
connectivityListener
.
onConnectivityChanged
(
true
);
verify
(
request
).
run
();
verify
(
request
Tracker
).
restartRequests
();
}
@Test
public
void
testCancelsAndRestartsNotYetFinishedRequestsWhenBecomesConnected
()
{
Request
request
=
mock
(
Request
.
class
);
when
(
request
.
isComplete
()).
thenReturn
(
false
);
manager
.
addRequest
(
request
);
manager
.
onConnectivityChanged
(
true
);
public
void
testDoesNotRestartRequestsOnDisconnected
()
{
connectivityListener
.
onConnectivityChanged
(
false
);
verify
(
request
).
clear
();
verify
(
request
).
run
();
verify
(
requestTracker
,
never
()).
restartRequests
();
}
}
library/src/test/java/com/bumptech/glide/manager/RequestTrackerTest.java
0 → 100644
浏览文件 @
6614298e
package
com.bumptech.glide.manager
;
import
com.bumptech.glide.request.Request
;
import
org.junit.Before
;
import
org.junit.Test
;
import
static
org
.
mockito
.
Mockito
.
mock
;
import
static
org
.
mockito
.
Mockito
.
never
;
import
static
org
.
mockito
.
Mockito
.
verify
;
import
static
org
.
mockito
.
Mockito
.
when
;
public
class
RequestTrackerTest
{
private
RequestTracker
tracker
;
@Before
public
void
setUp
()
{
tracker
=
new
RequestTracker
();
}
@Test
public
void
testClearRequestsClearsAddedRequests
()
{
Request
request
=
mock
(
Request
.
class
);
tracker
.
addRequest
(
request
);
tracker
.
clearRequests
();
verify
(
request
).
clear
();
}
@Test
public
void
testCanAddAndRemoveRequest
()
{
Request
request
=
mock
(
Request
.
class
);
tracker
.
addRequest
(
request
);
tracker
.
removeRequest
(
request
);
tracker
.
clearRequests
();
verify
(
request
,
never
()).
clear
();
}
@Test
public
void
testCanAddMultipleRequests
()
{
Request
first
=
mock
(
Request
.
class
);
Request
second
=
mock
(
Request
.
class
);
tracker
.
addRequest
(
first
);
tracker
.
addRequest
(
second
);
tracker
.
clearRequests
();
verify
(
first
).
clear
();
verify
(
second
).
clear
();
}
@Test
public
void
testClearsInProgressRequestsOnPause
()
{
Request
request
=
mock
(
Request
.
class
);
when
(
request
.
isRunning
()).
thenReturn
(
true
);
tracker
.
addRequest
(
request
);
tracker
.
pauseRequests
();
verify
(
request
).
clear
();
}
@Test
public
void
testDoesNotClearCompleteRequestsOnPause
()
{
Request
request
=
mock
(
Request
.
class
);
when
(
request
.
isComplete
()).
thenReturn
(
true
);
tracker
.
addRequest
(
request
);
tracker
.
pauseRequests
();
verify
(
request
,
never
()).
clear
();
}
@Test
public
void
testDoesNotClearFailedRequestsOnPause
()
{
Request
request
=
mock
(
Request
.
class
);
when
(
request
.
isFailed
()).
thenReturn
(
true
);
tracker
.
addRequest
(
request
);
tracker
.
pauseRequests
();
verify
(
request
,
never
()).
clear
();
}
@Test
public
void
testRestartsStoppedRequestOnResume
()
{
Request
request
=
mock
(
Request
.
class
);
tracker
.
addRequest
(
request
);
tracker
.
resumeRequests
();
verify
(
request
).
run
();
}
@Test
public
void
testDoesNotRestartCompletedRequestsOnResume
()
{
Request
request
=
mock
(
Request
.
class
);
when
(
request
.
isComplete
()).
thenReturn
(
true
);
tracker
.
addRequest
(
request
);
tracker
.
resumeRequests
();
verify
(
request
,
never
()).
run
();
}
@Test
public
void
testDoesRestartFailedRequestsOnResume
()
{
Request
request
=
mock
(
Request
.
class
);
when
(
request
.
isFailed
()).
thenReturn
(
true
);
tracker
.
addRequest
(
request
);
tracker
.
resumeRequests
();
verify
(
request
).
run
();
}
@Test
public
void
testDoesNotStartStartedRequestsOnResume
()
{
Request
request
=
mock
(
Request
.
class
);
when
(
request
.
isRunning
()).
thenReturn
(
true
);
tracker
.
addRequest
(
request
);
tracker
.
resumeRequests
();
verify
(
request
,
never
()).
run
();
}
@Test
public
void
testRestartsFailedRequestRestart
()
{
Request
request
=
mock
(
Request
.
class
);
when
(
request
.
isFailed
()).
thenReturn
(
true
);
tracker
.
addRequest
(
request
);
tracker
.
restartRequests
();
verify
(
request
).
run
();
}
@Test
public
void
testCancelsAndRestartsNotYetFinishedRequestsOnRestart
()
{
Request
request
=
mock
(
Request
.
class
);
when
(
request
.
isComplete
()).
thenReturn
(
false
);
tracker
.
addRequest
(
request
);
tracker
.
restartRequests
();
verify
(
request
).
clear
();
verify
(
request
).
run
();
}
}
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录