2017-08-24 6 views
0

J'essaie de charger une image d'une URL vers une image bitmap mais j'obtiens une erreur NetworkOnMainThreadException mais je ne sais pas pourquoi.Convertir une URL en résultats Bitmap dans une erreur réseau dans Android

C'est la méthode que je me sers:

public Bitmap getBitmapFromURL(String src) { 
    try { 
     java.net.URL url = new java.net.URL(src); 
     HttpURLConnection connection = (HttpURLConnection) url 
       .openConnection(); 
     connection.setDoInput(true); 
     connection.connect(); 
     InputStream input = connection.getInputStream(); 
     Bitmap myBitmap = BitmapFactory.decodeStream(input); 
     return myBitmap; 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 

J'ai aussi essayé de charger l'image à une cible en utilisant la bibliothèque Picasso, parce qu'à la fin, je veux obtenir la couleur dominante de cette image en utilisant la palette . Voici le code que j'ai en utilisant Picasso:

Picasso.with(MovieDetails.this) 
      .load("https://image.tmdb.org/t/p/w500" + backdrop) 
      .into(new Target() { 
       @Override 
       public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { 
        Palette palette = Palette.from(bitmap).generate(); 
        System.out.println(palette.getVibrantSwatch().toString().substring(16, Math.min(palette.getVibrantSwatch().toString().length(), 22))); 
        LinearLayout lLayout = (LinearLayout) findViewById(R.id.layout_bg); 
        lLayout.setBackgroundColor(Color.parseColor("#"+ palette.getVibrantSwatch().toString().substring(16, Math.min(palette.getVibrantSwatch().toString().length(), 22)))); 
       } 

       @Override 
       public void onBitmapFailed(Drawable errorDrawable) { 

       } 

       @Override 
       public void onPrepareLoad(Drawable placeHolderDrawable) { 

       } 
      }); 

Je mets cela à l'intérieur de ma méthode onCreate, mais je reçois « méthode ne remplace pas la méthode de sa superclasse » erreurs dans toutes les trois méthodes @Override.

Répondre

0

La façon de corriger le premier problème consiste à effectuer cette action dans un Thread ou un Runnable. Il y a un indicateur que vous pouvez définir comme StrictModeEnabled ou quelque chose comme ça, mais c'est mauvais, ne le faites pas.

En ce qui picasso, je ne sais pas sur les méthodes prépondérants de chose superclasse, je vais essayer de le faire dans onViewCreated au lieu de onCreate

+0

Merci pour la réponse. Comment dois-je gérer le fil? J'ai créé le 'nouveau fil', 'run()', 'try' et à l'intérieur 'while (true)' j'ai: 'sleep (1000);' «handler.post (this)». Comment dois-je mettre à l'intérieur du fil? Et qu'est-ce que je fais avec les autres méthodes qui dépendent du résultat de cette méthode? –

0

j'ai réussi à résoudre mon problème en utilisant un AsyncTask comme suit:

Je mets cela à la fin de mon activité:

public class MyAsync extends AsyncTask<Void, Void, Bitmap>{ 

    @Override 
    protected Bitmap doInBackground(Void... params) { 

     try { 
      URL url = new URL("https://image.tmdb.org/t/p/w500" + backdrop); 
      HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
      connection.setDoInput(true); 
      connection.connect(); 
      InputStream input = connection.getInputStream(); 
      Bitmap myBitmap = BitmapFactory.decodeStream(input); 
      return myBitmap; 

     } catch (IOException e) { 
      e.printStackTrace(); 
      return null; 
     } 

    } 
} 

S'il vous plaît noter que dans cette méthode, je mets l'URL de l'image.

Pour accéder à la Bitmap dans mon activité et obtenir la couleur dominante avec la palette Je l'ai fait:

MyAsync obj = new MyAsync(){ 

      @Override 
      protected void onPostExecute(Bitmap bmp) { 
       super.onPostExecute(bmp); 

       Bitmap bm = bmp; 

       if (bm != null && !bm.isRecycled()) { 
        Palette palette = Palette.from(bm).generate(); 
        System.out.println(palette.getVibrantSwatch().toString().substring(16, Math.min(palette.getVibrantSwatch().toString().length(), 22))); 
        LinearLayout lLayout = (LinearLayout) findViewById(R.id.layout_bg); 
        lLayout.setBackgroundColor(Color.parseColor("#"+ palette.getVibrantSwatch().toString().substring(16, Math.min(palette.getVibrantSwatch().toString().length(), 22)))); 
       } 


      } 
     }; 

     obj.execute(); 

Ce code est dans ma méthode onCreate.