Besoin d'Aide dans le Téléchargement des Images de Fond dans Android?
J'ai une image vue , j'avais écrit à glisser , à l'époque de balayage,les images sont à télécharger à partir d'Internet, j'ai donc pensé que je dois télécharger les images en arrière-plan avant de glisser , pour ce que j'ai besoin d'utiliser asynctask ou d'un Service ou IntentService, tous ces va de l'aide dans le téléchargement et le stockage de données/data/mypackages , mais encore le balayage est au ralenti dans mon cas, une idée, également transmettre moi lequel est le meilleur, est-ce que je vais appeler dans un droit chemin
1. asynctask
2. services
3. L'intention du Service comme indiqué ci-dessous,
je m confondre laquelle est la bonne méthode, car toujours mon problème n'est pas résolu
Voici asynctask exemple de code snippet
public class Demo extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
new FirstTask().execute(); //calling Asynctask here
}
}
Async code de la Tâche
private class FirstTask extends AsyncTask<Void, Void, Void> {
private final ProgressDialog dialog = new ProgressDialog(Catalogue.this);
int temp = 0;
//can use UI thread here
protected void onPreExecute() {
this.dialog.setMessage("Loading...");
this.dialog.setCancelable(false);
//this.dialog.show();
System.gc();
Toast.makeText(Catalogue.this, "My Async Created",
Toast.LENGTH_LONG).show();
}
@Override
protected Void doInBackground(Void... params) {
Looper.prepare();
try {
myddownloadmethod();//calling my download method
} catch (Exception e) {
Util.trace("Error in Async"+e.getMessage());
}
Looper.loop();
return null;
}
protected void onPostExecute(Void result) {
if (this.dialog.isShowing()) {
Toast.makeText(Catalogue.this, "My Async destroyed",
Toast.LENGTH_LONG).show();
Toast.makeText(Catalogue.this, "count" + temp,
Toast.LENGTH_LONG).show();
this.dialog.dismiss();
}
}
}
Voici Mon Service sinppet
public class MyService extends Service implements Runnable
{ @Override
public void onCreate() {
super.onCreate();
Thread mythread = new Thread(this);
mythread.start();
}
public void run() {
Looper.prepare();
try {
myddownloadmethod();//calling my download method
} catch (Exception e1) {
//TODO Auto-generated catch block
e1.printStackTrace();
}
Looper.loop();
}
@Override
public IBinder onBind(Intent intent) {
//TODO Auto-generated method stub
return null;
}
}
Invoking Service
public class ServicesDemo extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
startService(new Intent(this, MyService.class));
}
}
Voici IntentService Code
public class Downloader extends IntentService {
public Downloader() {
super("Downloader");
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public void onHandleIntent(Intent i) {
try {
myddownloadmethod();//calling my download method
} catch (Exception e1) {
//TODO Auto-generated catch block
Log.d("Error",e1.getMessage());
}
}
}
Appel IntentService de MyActivity
public class ServicesDemo extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Intent i1=new Intent(this, Downloader.class);
startService(i1);
}
}
- Looper.prepare(); dans doInBackground pourquoi ? ressemble à des défauts de conception
- j'ai eu cette exception ,ne Peut pas créer de gestionnaire à l'intérieur de thread qui n'a pas appelé Looper.prepare() , c'est pourquoi j'avais utilisé
- heh ne pas utiliser le thread d'INTERFACE utilisateur dans doInBackground ... utiliser publishProgress et remplacer onProgressUpdate et de cette méthode ne somtheting sur le thread de l'INTERFACE utilisateur ... c'est comment AsyncTask fonctionne ...
- peut expliquer avec un exemple dans onProgressUpdate
- quel type de minuterie que vous utilisez ?
- Je ne suis pas à l'aide de n'importe quel chrono
- si vous wana faites glisser votre image juste après elle est téléchargeable ?
- selvin , lorsque vous êtes en affichage de la première image dans l'INTERFACE utilisateur , je m satrting de téléchargement en arrière-plan
- et vous glissez juste après la nouvelle est téléchargé? ou après un certain laps de temps ?
- Non, je m balayage parallèle, en fait ce que j'avais prévu au moment de l'affichage de la première image, le téléchargement doit commence en arrière-plan , vous pouvez la glisser , j'ai vu dans les données/données du dossier que certaines images sont téléchargées
- vous êtes en train de construire quelque chose comme la Galerie avec des images dynamiques ?
- Selvin: ce que j'ai fait lorsque vous effectuez un balayage à l'époque j'avais appelé une méthode qui vérifie l'image de données/dossier de données, il est aviable , puis il procède à l'extraction à partir de là, ou sinon il aller pour l'url pour télécharger le problème est la plupart du temps, il va pour le téléchargement à partir de l'url pas pris le fichier dans /data/data dossier, dites-moi si j'avais utilisé le service et IntentService dans une bonne manière
- AsyncTask est assez ...dans doInBackground vous seulement de téléchargement de données et dans onPostExecute vous installation ImageView avec de nouvelles images
- ok je vais essayer merci pour vos commentaires et votre soutien
- avez-vous le contrôle sur les images/serveur?
Vous devez vous connecter pour publier un commentaire.
Le meilleur moyen de le télécharger en utilisant le service, comme je l'ai fait pour télécharger le fichier à partir du serveur et le mettre dans la carte SD aussi utiliser la notification pour elle.
Il est assez long code, mais je pense que le parfait,si vous n'avez pas à comprendre quelque chose alors s'il vous plaît aller à android blog des développeurs pour les services.
Pour toute personne qui exécute cette question plus tard, jetez un oeil à la async télécharger mécanisme utilisé dans le android un exemple de code pour le projet
com.example.android.bitmapfun.ui.ImageGridActivity
. Il télécharge des images de manière asynchrone et aussi les caches hors ligne de l'affichage dans une ImageView. Les gens ont enveloppé leur code de contourner ce fait l'image de chargement des bibliothèques de leur propre. Ces bibliothèques utilisent une AsyncTask au lieu d'un service. Async tâches devraient être achevés pour leur travail au sein d'un couple de secondes.Si vous êtes à la recherche de télécharger quelque chose de plus grand, je vous recommande la DownloadManager qui est disponible depuis API 9 au lieu de l'utilisation des services. Il y a beaucoup de code qui ajoute de la résilience pour le téléchargement.
Vous êtes probablement au cours de ce génie. J'ai mis en œuvre un balayage avec chargement dynamique d'images et j'ai juste utiliser un utilitaire simple classe qui fait tout pour moi par la méthode statique appel.
Essayez cette classe:
C'est tout ce dont vous avez besoin. Puis, quand vous avez besoin de charger une image, vous composez le:
Que c'est.
Si vous avez une URL à partir d'un objet JSON, d'analyser l'URL de votre chaîne afin de:
String url = jsonObj.getString("url");
Appelez ensuite
fetchDrawableOnThread(url, yourImageViewReference);
Utilisation de volley.
À l'aide de volley réseau d'affichage de l'image vous pouvez faire ce
nous utilisons les dernières architecture de composants ici.Nous faisons quelques observateurs avec des données réelles pour certaines drapeau qui représente l'état du téléchargement.Dans le service que nous téléchargement de l'image et de l'achèvement de nous mettre à jour les données en direct de sorte que les observateurs de la méthode appelée automatiquement