我在基于会话的应用程序使用卡尔图拉resftful APis工作。
设计是这样的,我在每个页面中都有一个视图pager+tablayout,我有一个片段,所有片段都绑定到单个活动。
在splash中,我连接到Api并创建了一个会话,现在我有多个网络调用(所有这些都必须在异步任务中完成)。
问题陈述:
假设我有C1、C2、C3、C4、C5、C6片段和
每个C都有它自己的数据集(通过n/w调用,异步任务)加载数据会阻塞主线程,如果用户滑动到另一个页面,一个新的异步任务将被执行,而前一个后台线程仍在加载,这会导致延迟和ANR。
建议:
管理每个片段的网络调用的最佳方法是什么:我是否应该在8-10左右为这些异步任务创建线程池,并在splash中启动线程池。
我非常热衷于活动的内存泄漏,并希望实现快速加载viewpager(片段的视图),我读了很多问题和@commonsWare Blog,也
this discussion on thread pooler,但想知道做上述问题的更好的方法/架构。
发布于 2016-10-18 15:43:25
试试RxJava。这是比异步任务更好的方法,因为异步任务不会同时进行多个网络调用。RxJava是一个很好的(但很难学的)库,它可以用来进行更简单的多线程。
你可以对它使用Retrofit,所以这不是问题。
有了kaltura API,你就得玩转了。
为了一次调用多个函数,你可以在几个调用中使用merge函数,这样所有的调用都会被一次调用。
您还可以在创建新片段时调用每个Observable,如果操作正确,RxJava将负责线程处理,因此“旧的”Observable不会停止,新的将继续加载新数据。
此外,zip函数可以很方便,因为它可以加载几个源到“一个”对象。
还有我的github项目的链接(很抱歉没有可读性):
https://github.com/JanuszHain/SocialMediaWatcher
您可能感兴趣的文件(使用不直接支持RxJava的API使用RxJava加载数据):
使用API库(Twitter)通过回调获取数据,然后从中创建观察值(例如,函数private Observable<ArrayList<Tweet>> createObservableReadTweets(final String screen_name, final int count)):https://github.com/JanuszHain/SocialMediaWatcher/blob/master/app/src/main/java/pl/janusz/hain/socialmediawatcher/TwitterTimelineGetter.java
订阅创建的函数( Observable observableGetNewTweets())。注意,我在这个函数中的Observable之外创建了新的Observable,所以它可能有点复杂:https://github.com/JanuszHain/SocialMediaWatcher/blob/master/app/src/main/java/pl/janusz/hain/socialmediawatcher/TwitterTimeline.java
创建Observables的ArrayList,然后合并(一次创建多个调用):https://github.com/JanuszHain/SocialMediaWatcher/blob/master/app/src/main/java/pl/janusz/hain/socialmediawatcher/TwitterWall.java
这是我的日程安排。它用于可观察的配置,限制线程数量以优化大量的新线程请求:https://github.com/JanuszHain/SocialMediaWatcher/blob/master/app/src/main/java/pl/janusz/hain/socialmediawatcher/util/MyScheduler.java
https://stackoverflow.com/questions/39720993
复制相似问题