1

Je sauvegarde les données du serveur dans la base de données locale dans un AsyncLoader (méthode onLoadFinished à l'intérieur je commence l'activité suivante où je veux afficher les données sauvegardées), mais la base de données est vide Lorsque de nouvelles données sont ajoutées (je veux dire, cela fonctionne bien avec les enregistrements de base de données existants), comment puis-je résoudre ce problème?Loader traite les données même après onLoadFinished

Activité

public class LoadingActivity extends AppCompatActivity implements android.app.LoaderManager.LoaderCallbacks<ArrayList> { 
    Context context; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.laoding_activity); 

     context = this; 
     Bundle bundle = new Bundle(); 

     getLoaderManager().initLoader(0, bundle, this).forceLoad(); 

     Intent broadcastIntent = new Intent(); 
     broadcastIntent.setAction(Utils.MANUAL_START_RECIEVER); 
     sendBroadcast(broadcastIntent); 
    } 
    @Override 
    protected void onPause() { 
     super.onPause(); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 

    } 

    @Override 
    public android.content.Loader<ArrayList> onCreateLoader(int id, Bundle args) { 
     DatabaseWorker loader= null; 
     args.putString(Utils.INTENT_SERVICE_INVOKE,Utils.LOAD_All_DATA); 
     loader = new DatabaseWorker(this,args); 
     return loader; 
    } 

    @Override 
    public void onLoadFinished(android.content.Loader<ArrayList> loader, ArrayList data) { 
     Log.e("adad",App.session.getActionsGreenDao().loadAll().size()+""); 
     startActivity(new Intent(this,MainActivity.class)); 
    } 

    @Override 
    public void onLoaderReset(android.content.Loader<ArrayList> loader) { 

    } 
} 

loadInBackground

@Override 
    public ArrayList loadInBackground() { 
     Log.e("loader created","loading"); 
     switch (command) { 
      case Utils.LOAD_All_DATA: { 
       saveActivities(); 
       savePersons(); 
       savePictureData(); 
       return new ArrayList(); 
      } 
      case Utils.READ_ACTIONS_DATA: { 
       readActionData(); 
       return (ArrayList) Action.listAll(Action.class); 
      } 
      case Utils.READ_PERSONS_DATA: { 
       readPersonsData(); 
       return (ArrayList) Person.listAll(Person.class); 
      } 
      default:{ 
       return new ArrayList(); 
      } 
     } 
    } 

Répondre

0

Quel type de DB utilisez-vous? Et comment insérez-vous des données? Comme je l'ai compris, vous le faites dans une transaction de thread async. Après cette méthode onLoadFinished est appelée. Mais commettre l'opération dans DB nécessite un certain temps dépend de la taille des données. C'est pourquoi votre DB est vide dans le fil de l'interface utilisateur. Tu peux le vérifier. Par exemple comme ceci:

new Handler(getMainLooper()).postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       Log.e("adad",App.session.getActionsGreenDao().loadAll().size()+""); 
       startActivity(new Intent(this,MainActivity.class)); 
      } 
     },1000); 
+0

J'utilise GreenDAO, je suis l'enregistrement des données à l'intérieur asyncLoader, quand il est enregistré Loader commence onLoadFinished et ISIDE il je commence theat activité voir actuellement les données (je lis la base de données également à l'aide AsyncLoader) donc votre cas est presque impossible. – Turbozanik