2015-02-28 1 views
0

Est-il possible d'utiliser ContentProvider pour récupérer des données (requête) à partir du serveur Web?Android: utilisez "ContentProvider" pour télécharger à partir du serveur Web

Certaines données qui sont utilisées dans l'application sont stockées localement et d'autres sont stockées dans le serveur Web, je veux encapsuler la récupération de données et également stocker des données par ContentProvider.

Il est évident que la récupération de données locale est simple et peut être fait par ContentProvider.query() method.My problème est en cours d'utilisation sur cette méthode pour interroger à partir web.Clearly je peux commencer à AsyncTask pour extraire des données de Web, mais retournée par la méthode query, avant terminant doInBackground() de AsyncTask et les données téléchargées jamais utilisées. Comment puis-je retourner les données téléchargées à la méthode d'interrogation?

Répondre

1

Est-il possible d'utiliser ContentProvider pour extraire des données (requête) du serveur Web ?

n °

Alors, comment puis-je renvoyer des données téléchargées à la méthode interroger?

vous ne pouvez pas supprimer le délai de téléchargement évidemment, mais vous pouvez par exemple utiliser loader et après vos données est prêt (téléchargé) l'insérer dans la base de données et appeler

getContentResolver().notifyChange(your uri, null); 

ou vous pouvez utiliser d'autres méthode comme LocalBroadcastManager ou EventBus pour envoyer des messages à votre objet pour interroger le ContentProvider à nouveau.

0

Je pense que vous pouvez simplement déplacer AsyncTask de fournisseur de contenu à l'application principale et attraper le résultat, comme

new AsyncTask<String, Integer, Cursor>(){ 
      @Override 
      protected Cursor doInBackground(String... params) { 
       return getApplicationContext().getContentResolver().query(...); 
      } 
     }.execute(""); 

post-scriptum J'ai également trouvé des mots intéressants dans Google docs: méthodes query(), insert(), delete(), update(), et getType() - sont appelées à partir d'un pool de threads dans le processus du fournisseur de contenu, pas le Fil d'interface utilisateur pour le processus.

Mais quand j'ai essayé d'appeler le fonctionnement du réseau dans la méthode de requête (sans AsyncTask), il lance simplement l'exception NetworkOperationInMainThread.