2017-09-13 8 views
0

Dans mon application, il existe une méthode d'obtention de données via l'API. Il est effectué dans IntentService. Les données reçues sont écrites dans la base de données. J'ai réécrit cette méthode avec l'aide du rxjava, mais le temps d'exécution a considérablement augmenté. Voici mon code dans IntentServiceAndroid mon code rxjava fonctionne lentement

Call<List<DocLine>> DocLineResult = mApi.getDocLine(UserID, LastUserDate); 
Response<List<DocLine>> responseDocLine = DocLineResult.execute(); 
if (responseDocLine.isSuccessful()) { 
    List<DocLine> docLines = responseDocLine.body(); 
    if (docLines != null) { 
     for (DocLine item : docLines) { 
      mContents = new ContentValues(); 
      //filling mContents from item 
      dbBase.insertWithOnConflict(dbTabName, null, mContents, SQLiteDatabase.CONFLICT_REPLACE); 
     } 
     Log.d(AppGlobal.LOG_TAG, dbTabName + " => " + docLines.size()); 
    } 
} 
else { 
    if (responseDocHead.raw() != null && responseDocHead.raw().code() == 404) { 
     throw new Exception(getString(R.string.error_null_user)); 
    else 
     throw new Exception("Error"); 
    } 
} 

Voici mon code rxjava

Observable oDocLine = apiService.getDocLine(userId, lastSyncDate) 
      .flatMap(Observable::from) 
      .flatMap(docLine -> Observable.create(subscriber -> {workDB.save(docLine, null); subscriber.onCompleted();}) 
      .subscribeOn(Schedulers.io())); 
+0

ne pas mélanger pascalcase et camelcase pour la dénomination variable. Il rend votre code impossible à lire –

+0

merci pour la critique – user1854307

+0

c'est constructif, essayez de suivre les conventions de nommage java –

Répondre

0

Vous deuxième flatmap semble pas utile, sauf pour ajouter un effet secondaire.

Observable oDocLine = apiService.getDocLine(userId, lastSyncDate) 
      .flatMap(Observable::from)    
      .subscribeOn(Schedulers.io()) 
      .observeOn(Schedulers.io()) 
      .subscribe(docLine -> workDB.save(docLine, null)); 

Devrait être, espérons-le, plus efficace.