2017-05-04 93 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 –