[关闭]
@zyl06 2017-02-11T23:51:25.000000Z 字数 3982 阅读 1303

资源回收 Dispsable

Lua


在进行开发的时候,或多或少会使用到各种资源,如计时器、Http请求、事件监听
、数据库连接等等,而在使用完资源之后,是需要程序员记得去释放这些资源的。
为此提供了 Disposable 模块,负责资源回收操作。模块中也提供了 GroupdisposableUniquedisposable,用于不同的回收策略。

1 统一看待回收的资源

由于资源类型的不同,因此不同的资源会有不同的方式去释放它们。

  1. --定义一个每2秒执行一个计时器
  2. local timer = setInterval(function()
  3. print("每2秒打印一次")
  4. end, 2)
  5. --忽略其他代码
  6. --撤销计时器,并释放资源
  7. timer:invalidate()
  8. 代码1
  1. --定义一个http请求
  2. local httpReq = getApplication():getHttpComponent():sendHTTPRequest(url, method, requestHeaders, postBody, bNeedEncrypt, timeout, cb, cachePolicy)
  3. --忽略其他代码
  4. --若请求还没发送成功,取消http请求
  5. httpReq:cancelHttpRequest()
  6. 代码2

而当程序员接触到的资源类型变的越来越多的时候,就需要记忆多种不同的释放接口,同时对资源的管理也会变的更加不容易。
为减轻程序员负担,ColorTouch中将需要释放的资源统一看作是一种类型:Disposable,通过disposable.dispose()方法释放资源。由此代码1,2可写成代码3,4的样子。

  1. --定义一个每2秒执行一个计时器
  2. local timerDisposable = setInterval(function()
  3. print("每2秒打印一次")
  4. end, 2)
  5. --忽略其他代码
  6. --撤销计时器,并释放资源
  7. timerDisposable.dispose()
  8. 代码3

为分别应对这 2 种需求,提供了 GroupDisposableUniqueDisposable 这 2 种不同的资源管理策略。

程序员不仅需要记得释放资源,也需要提供策略决定何时释放资源。比较常见的有如下2种情况:

  1. 在一个ViewController(Activity)实例的生存期间,程序员需要使用了各种资源,而在ViewController(Activity) pop(finish)的时候,释放全部的资源。
  2. 程序中可能需要多次发送http请求,而如果前一个http请求还未发送成功,则需要被取消掉,从而保证正在发送的请求仅有一个

为分别应对这2种需求,ColorTouch提供了GroupDisposable、UniqueDisposable这2种不同的资源管理策略。

  1. --引用GroupDisposable的模块
  2. local GroupDisposable = require "stdlib.Disposable.GroupDisposable"
  3. --定义一个GroupDisposable实例
  4. local groupDisposable = GroupDisposable()
  5. --自定义3个拥有dispose接口的实例,用来模拟需要释放的资源
  6. local disposable0 = {}
  7. disposable0.dispose = function()
  8. print("dispose disposable0")
  9. end
  10. local disposable1 = {}
  11. disposable1.dispose = function()
  12. print("dispose disposable1")
  13. end
  14. local disposable2 = {}
  15. disposable2.dispose = function()
  16. print("dispose disposable2")
  17. end
  18. --将3个资源实例添加进groupDisposable
  19. print("add disposable0")
  20. groupDisposable.addDisposable(disposable0)
  21. print("add disposable1")
  22. groupDisposable.addDisposable(disposable1)
  23. print("add disposable2")
  24. groupDisposable.addDisposable(disposable2)
  25. --统一释放资源
  26. print("\ndispose groupDisposable")
  27. groupDisposable.dispose()
  28. 代码5
  1. 运行结果:
  2. add disposable0
  3. add disposable1
  4. add disposable2
  5. dispose groupDisposable
  6. dispose disposable0
  7. dispose disposable1
  8. dispose disposable2

3 自由组合 Disposable

模块中提供 GroupDisposableUniqueDisposable,可添加其他 Disposable。同时GroupDisposableUniqueDisposable 也是 Disposable 类型,可作为子 Disposable。由此各种资源就可以任意组合,对于程序员来说也能方便地定制出自己需要的资源管理策略

  1. --引用UniqueDisposable的模块
  2. local UniqueDisposable = require "stdlib.Disposable.UniqueDisposable"
  3. --定义一个UniqueDisposable实例
  4. local uniqueDisposable = UniqueDisposable()
  5. --将3个资源实例添加进uniqueDisposable
  6. print("add disposable0")
  7. uniqueDisposable.addDisposable(disposable0)
  8. print("add disposable1")
  9. uniqueDisposable.addDisposable(disposable1)
  10. print("add disposable2")
  11. uniqueDisposable.addDisposable(disposable2)
  12. --统一释放资源
  13. print("\ndispose uniqueDisposable")
  14. uniqueDisposable.dispose()
  15. 代码6

由于 Disposable 的多次组合,很可能在一个 groupDisposableuniqueDisposable 中存在重复的 Disposable 对象。为了进一步减轻程序员的负担,同时也为了方便资源的管理,Disposable 类型的数据允许多次调用 dispose 函数,其中仅有第一次调用会真正的释放资源,后续的重复调用并不做事情。

  1. 运行结果:
  2. add disposable0
  3. add disposable1
  4. dispose disposable0
  5. add disposable2
  6. dispose disposable1
  7. dispose uniqueDisposable
  8. dispose disposable2

3 自由组合Disposable

模块中提供GroupDisposable、UniqueDisposable,可添加其他Disposable。同时GroupDisposable、UniqueDisposable也是Disposable类型,可作为子Disposable。由此各种资源就可以任意组合,对于程序员来说也能方便地定制出自己需要的资源管理策略

  1. --引用GroupDisposable的模块
  2. local GroupDisposable = require "stdlib.Disposable.GroupDisposable"
  3. --引用UniqueDisposable的模块
  4. local UniqueDisposable = require "stdlib.Disposable.UniqueDisposable"
  5. local uniqueDisposable = UniqueDisposable()
  6. uniqueDisposable.addDisposable(disposable0)
  7. uniqueDisposable.addDisposable(disposable1)
  8. local groupDisposable = GroupDisposable()
  9. groupDisposable.addDisposable(disposable2)
  10. groupDisposable.addDisposable(uniqueDisposable)
  11. groupDisposable.dispose()

由于Disposable的多次组合,很可能在一个groupDisposable或uniqueDisposable中存在重复的Disposable对象。为了进一步减轻程序员的负担,同时也为了方便资源的管理,Disposable类型的数据允许多次调用dispose函数,其中仅有第一次调用会真正的释放资源,后续的重复调用并不做事情。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注