Android HTML ImageGetter As AsyncTask

D'accord, je perds la tête à propos de celui-ci. J'ai une méthode dans mon programme qui analyse le code HTML. Je veux inclure les images en ligne, et j'ai l'impression que l'utilisation de Html.fromHtml (chaîne, Html.ImageGetter, Html.TagHandler) permettra que cela se produise.

Étant donné que Html.ImageGetter n'a pas de mise en œuvre, il appartient à moi d'en écrire. Cependant, puisque l'analyse des URL dans Drawables nécessite un accès au réseau, je ne peux pas le faire sur le thread principal, donc il doit s'agir d'un AsyncTask. Je pense.

  • Ndk-stack ne fonctionne pas
  • Android lorsque ViewPager insère comme Child get error android.view.ViewGroup.jumpDrawablesToCurrentState (ViewGroup.java:5035)
  • Existe-t-il une bibliothèque Base64 compatible avec Android et Java?
  • TelephonyManager.getLine1Number () en panne?
  • Comment faire une notification push du serveur vers Android
  • Différence entre targetSdkVersion et Objectif de construction du projet
  • Cependant, lorsque vous passez ImageGetter comme paramètre à Html.fromHtml, il utilise la méthode getDrawable qui doit être remplacée. Donc, il n'y a aucun moyen d'appeler l'opération entière ImageGetter.execute qui déclenche la méthode doInBackground, et il n'y a donc aucun moyen de la rendre asynchrone.

    Est-ce que je suis complètement mal, ou pire, est-ce impossible? Merci

  • Comment détecter la position de la zone des notifications?
  • Contexte d'activité de finition Android
  • Android Apk décompilation semble facile
  • Communiquer directement entre deux appareils mobiles
  • Intégrez l'authentification par firebase avec les points d'extrémité du cloud moteur du moteur de recherche Google
  • Ajouter un bouton à une poignée de glissière coulissante?
  • 5 Solutions collect form web for “Android HTML ImageGetter As AsyncTask”

    J'ai fait quelque chose de très semblable (je pense) à ce que vous voulez faire. Ce que je devais faire à ce moment-là, analyse le HTML et le redémarre à TextView et je devais également utiliser Html.ImageGetter et avoir le même problème lors de l'extraction de l'image sur le thread principal.

    Les étapes que j'ai faites essentiellement:

    • Créez ma propre sous-classe pour Drawable pour faciliter le redessiner, je l'ai appelé URLDrawable
    • Renvoie l' URLDrawable dans la méthode Html.ImageGetter de Html.ImageGetter
    • Une fois onPostExecute appelé, je redessine le conteneur du résultat Spanned

    Maintenant, le code pour URLDrawable est comme suit

     public class URLDrawable extends BitmapDrawable { // the drawable that you need to set, you could set the initial drawing // with the loading image if you need to protected Drawable drawable; @Override public void draw(Canvas canvas) { // override the draw to facilitate refresh function later if(drawable != null) { drawable.draw(canvas); } } } 

    Assez simple, je supprime simplement le draw afin qu'il choisisse le Drawable que je mets là-bas après l'arrivée de AsyncTask.

    La classe suivante est la mise en œuvre de Html.ImageGetter et celle qui récupère l'image depuis AsyncTask et met à jour l'image

     public class URLImageParser implements ImageGetter { Context c; View container; /*** * Construct the URLImageParser which will execute AsyncTask and refresh the container * @param t * @param c */ public URLImageParser(View t, Context c) { this.c = c; this.container = t; } public Drawable getDrawable(String source) { URLDrawable urlDrawable = new URLDrawable(); // get the actual source ImageGetterAsyncTask asyncTask = new ImageGetterAsyncTask( urlDrawable); asyncTask.execute(source); // return reference to URLDrawable where I will change with actual image from // the src tag return urlDrawable; } public class ImageGetterAsyncTask extends AsyncTask<String, Void, Drawable> { URLDrawable urlDrawable; public ImageGetterAsyncTask(URLDrawable d) { this.urlDrawable = d; } @Override protected Drawable doInBackground(String... params) { String source = params[0]; return fetchDrawable(source); } @Override protected void onPostExecute(Drawable result) { // set the correct bound according to the result from HTTP call urlDrawable.setBounds(0, 0, 0 + result.getIntrinsicWidth(), 0 + result.getIntrinsicHeight()); // change the reference of the current drawable to the result // from the HTTP call urlDrawable.drawable = result; // redraw the image by invalidating the container URLImageParser.this.container.invalidate(); } /*** * Get the Drawable from URL * @param urlString * @return */ public Drawable fetchDrawable(String urlString) { try { InputStream is = fetch(urlString); Drawable drawable = Drawable.createFromStream(is, "src"); drawable.setBounds(0, 0, 0 + drawable.getIntrinsicWidth(), 0 + drawable.getIntrinsicHeight()); return drawable; } catch (Exception e) { return null; } } private InputStream fetch(String urlString) throws MalformedURLException, IOException { DefaultHttpClient httpClient = new DefaultHttpClient(); HttpGet request = new HttpGet(urlString); HttpResponse response = httpClient.execute(request); return response.getEntity().getContent(); } } } 

    Enfin, ci-dessous est l'exemple de programme pour démontrer comment les choses fonctionnent:

     String html = "Hello " + "<img src='http://www.gravatar.com/avatar/" + "f9dd8b16d54f483f22c0b7a7e3d840f9?s=32&d=identicon&r=PG'/>" + " This is a test " + "<img src='http://www.gravatar.com/avatar/a9317e7f0a78bb10a980cadd9dd035c9?s=32&d=identicon&r=PG'/>"; this.textView = (TextView)this.findViewById(R.id.textview); URLImageParser p = new URLImageParser(textView, this); Spanned htmlSpan = Html.fromHtml(html, p, null); textView.setText(htmlSpan); 

    Pas mal. Toutefois, le type DefaultHttpClient est obsolète. Essayez ceci sur la méthode de récupération:

     private InputStream fetch(String urlString) throws MalformedURLException, IOException { URL url = new URL(urlString); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); InputStream stream = urlConnection.getInputStream(); return stream; } 

    J'ai été un peu confus, le HTML que vous voulez rendre statique et simplement pour le formatage, ou est-il dynamique et issu du Web? Si vous vouliez ce dernier, c'est-à-dire pour rendre le HTML et récupérer les images, bien ça va être un peu douloureux (suggestion – utilisez simplement un WebView?).

    Quoi qu'il en soit, vous devriez d'abord exécuter AsyncTask pour récupérer le HTML initial. Vous passerez ensuite ces résultats dans Html.fromHtml() avec l'implémentation personnalisée pour la classe Html.ImageGetter . Ensuite, dans cette implémentation, vous devriez lancer un AsyncTask individuel pour récupérer chacune des images (vous voulez probablement implémenter une mise en cache).

    Cependant, à partir de la lecture de la documentation (et je pense avoir vu des échantillons), il me semble que ce n'est pas ce qu'ils ont voulu dire pour le Html.ImageGetter . Je pense qu'il est destiné au HTML codé en dur avec des références à des tirages internes , mais c'est juste ma prise.

    Si vous utilisez Picasso, changez une partie du code @momo pour

     /*** * Get the Drawable from URL * @param urlString * @return */ public Drawable fetchDrawable(String urlString) { try { Drawable drawable = fetch(urlString); drawable.setBounds(0, 0, 0 + drawable.getIntrinsicWidth(), 0 + drawable.getIntrinsicHeight()); return drawable; } catch (Exception e) { return null; } } private Drawable fetch(String urlString) throws MalformedURLException, IOException { return new BitmapDrawable(c.getResources(), Picasso.with(c).load(urlString).get()); } 

    AsyncTask task = new AsyncTask () {

      @Override protected String doInBackground(Integer... params) { span = Html.fromHtml(noticeList.get(0) .getContent(), imgGetter, null); return null; } @Override protected void onPostExecute(String result) { super.onPostExecute(result); text.setMovementMethod(ScrollingMovementMethod .getInstance()); if(span != null){ text.setText(span); } } }; task.execute(); 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.