2017-05-04 90 views
1

我是非常新的异步编程。我正在读取Json数组中的数据库的所有数据,然后在观察者中从我调用另一个观察者的位置迭代它以将数据发送到server.But问题是我只接收json数组的第一个值,然后它终止。有没有什么东西出现在Rx java中来处理这件事情?我想从json数组中向服务器发送一个值。我应该使用flatmapiterable将数据返回给serverpost观察者吗?还是应该使用其他技术?Android:在for循环中调用Observer并返回值

这里是我的代码:

return getdatafromDb().flatMap(new Func1<String, Observable<String>>() { 
      public Observable<String> call(String data) { 
       try { 
        JSONArray jsonarray = new JSONObject(data).getJSONArray("sql_data"); 
        for (int i = 0; i < jsonarray.length(); i++) { 
         datamaker.money = (Double) jsonarray.getJSONObject(i).get("money"); 
         datamaker.income = (Double) jsonarray.getJSONObject(i).get("income"); 
         datamaker.tag = (String) jsonarray.getJSONObject(i).get("tag"); 
         return serverpost(datamaker); //this calls another observer to post data to server 
        } 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
       return nothing; 

      } 
     }); 

回答

1

道歉,因为这是Java 8:

return getdatafromDb() 
    .flatMapIterable(data -> new JSONObject(data).getJSONArray("sql_data")) 
    .cast(JSONObject.class) 
    .map(o -> { 
     DataMaker datamaker = new DataMaker(); // whatever, but use new instance 
     datamaker.money = (Double) o.get("money"); 
     datamaker.income = (Double) o.get("income"); 
     datamaker.tag = (String) o.get("tag"); 
     return datamaker; 
    }) 
    .flatMap(datamaker -> serverpost(datamaker)); 

几点建议:

  • ,而不是解析JSON手动对象所有的时间,使getDataFromDB返回一个真正的诚实神解析对象。
  • 将datamaker的东西提取到一个方法中,或者如果它使用了足够多的时间,则将其作为datamaker上的静态方法。
  • 如果getJsonArray返回的类型不是可迭代的,那就这样做。
+0

没问题谢谢。是否有可能让你没有lambda表达式? – SimpleMan

+0

这是留给读者的一个练习:-D –