我有三组对象都在同一个Realm数据库中。每个组都是一组标签和其他信息,对于每个标签,我必须向网络发出接收ID的请求。每个组的查询都不同(URL更改和响应)。
必须同时对每个组发出请求,每分钟不超过20个查询。即使活动被破坏,该程序也应该可以工作。我做了IntentServie,但是我不知道下一步应该怎么做。如何正确执行延迟的并行查询?是否可以使用IntentService?
显示周期“ for”可以更好地理解问题。另外,所有响应都应写入单个数据库中,这就是为什么访问必须对所有流都可用的原因。
public class SubscribersGathering extends IntentService {
private RealmResults<HashtagObject> hashtags;
private RealmResults<SearchtagObject> searchtags;
private RealmResults<NametagObject> nametags;
public SubscribersGathering() {
super("SubscribersGathering");
}
@Override
protected void onHandleIntent(Intent intent) {
Realm realmForThisThread = Realm.getDefaultInstance();
this.hashtags = realmForThisThread.where(HashtagObject.class).findAll();
this.searchtags = realmForThisThread.where(SearchtagObject.class).findAll();
this.nametags = realmForThisThread.where(NametagObject.class).findAll();
realmForThisThread.close();
for(int i=0;i<hashtags.size();i++){
getHashtagTag(hashtags.get(i).getHashtag());
}
for(int i=0;i< searchtags.size();i++){
getSearchTags(searchtags.get(i).getId());
}
etc
}
private void getHashtagTag(final String tagName){
HttpURLConnection urlConnection = null;
try {
URL url = new URL(“URL_1”);
urlConnection = (HttpURLConnection) url
.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.setDoInput(true);
urlConnection.connect();
String response = Tools.streamToString(urlConnection
.getInputStream());
JSONObject jsonObj = (JSONObject) new JSONTokener(response)
.nextValue();
for(int i=0;i<jsonObj.getJSONArray("data").length();i++) {
JSONObject json = (JSONObject) jsonObj.getJSONArray("data").get(i);
Log.d(tagName, json.getJSONObject("user").getString("id"));
}
}catch(Exception exc){
exc.printStackTrace();
}finally {
if(urlConnection!=null){
try{
urlConnection.disconnect();
}catch(Exception e){
e.printStackTrace();
}
}
}
}
private void getSearchTags (final String tagName){
}
etc
}
您有很多选择来执行网络操作的并行运行。选择什么取决于您。基本上,我可以建议您使用以下之一:
基于ExecutorService的解决方案
将您的任务拆分为可运行的对象,然后使用ExecutorService运行它们。代码可能看起来像这样:
public void onHandleIntent(Intent intent) {
Runnable hashtagsTask = new Runnable() {
@Override
public void run() {
for (int i = 0; i < hashtags.size(); i++) {
getHashtag(i);// do something, fetch hashtags, etc
}
}
};
Runnable searchtagsTask = new Runnable() {
@Override
public void run() {
// do something
}
};
ExecutorService pool = Executors.newFixedThreadPool(3);
pool.execute(hashtagsTask);
pool.execute(searchtagsTask);
// etc
pool.awaitTermination();
}
将您的任务分成几个IntentServices。因此,每个服务都将获取其自己的数据。我个人认为这不是一个好的解决方案,但是在某些情况下,它可能很灵活。
使用RxJava及其Observable#zip方法。这里的关键思想是将每个可观察对象订阅到其自己的线程:
public void onHandleIntent(Intent intent) {
Observable.zip(
getHashtags().subscribeOn(Schedulers.newThread()),
getSearchtags().subscribeOn(Schedulers.newThread()),
new Func2<List<String>, List<String>, Void>() {
@Override
public Void call(List<String> hashtags, List<String> searchtags) {
// do something with your data
return null;
}
}
)
.subscribe();
}
private Observable<List<String>> getHashtags() {
return Observable.defer(new Func0<Observable<List<String>>>() {
@Override
public Observable<List<String>> call() {
// fetch your data
return null;
}
};
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句