延迟网络请求组

德尔菲安

我有三组对象都在同一个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

}

安德烈·扎伊特切夫

您有很多选择来执行网络操作的并行运行。选择什么取决于您。基本上,我可以建议您使用以下之一:

  1. 基于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();
    }
    
  2. 将您的任务分成几个IntentServices因此,每个服务都将获取其自己的数据。我个人认为这不是一个好的解决方案,但是在某些情况下,它可能很灵活。

  3. 使用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章