2017-08-15 4 views
0

Donc, dans onCreate, j'essaie de changer l'image d'un en-tête de vue de navigation avec un autre que je peux accéder via une URL. J'utilise un AsyncTask pour ce faire:Modifier l'image de l'en-tête de menu en utilisant AsyncTask

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_sidebar_menu); 

     NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
     navigationView.setNavigationItemSelectedListener(this); 

     View headerView = navigationView.getHeaderView(0); 

     User u = MainProvider.sharedInstance().getCurrentUser(this); 
     TextView usernameText = (TextView) headerView.findViewById(R.id.usernameText); 

     ImageView profilePicture = (ImageView)headerView.findViewById(R.id.profilePicture); 
     String profilePictureUrl = u.getSettings().get("profile_picture").getAsString(); 
     new convertUrlToBitmap().execute(profilePictureUrl); 
     profilePicture.setImageBitmap(); 
    } 

Et mon AsyncTask ressemble à ceci:

class convertUrlToBitmap extends AsyncTask<String, Void, Bitmap> { 

    private Exception exception; 

    protected Bitmap doInBackground(String... urls) { 
     try { 
      URL url = new URL(urls[0]); 
      HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
      connection.setDoInput(true); 
      connection.connect(); 
      InputStream input = connection.getInputStream(); 
      Bitmap myBitmap = BitmapFactory.decodeStream(input); 
      connection.disconnect(); 
      return myBitmap; 
     } catch (IOException e) { 
      // Log exception 
      return null; 
     } 
    } 

    protected void onPostExecute(Bitmap myBitmap) { 
     // TODO: check this.exception 
     // TODO: do something with the feed 

    } 
} 

Ce que je ne parviens pas à comprendre comment utiliser ce que je reçois de ma tâche dans la méthode setImageBitmap:

profilePicture.setImageBitmap() 

Merci à tous pour votre temps et vos efforts!

+0

convertUrlToBitmap est une classe séparée ou juste son intérieur Activity ..? –

+0

Dans mon activité – Alphonse

Répondre

0

Au lieu d'ajouter profilePicture comme variable locale ajouter comme variable globale, et sur onPostExecute, vient de mettre la Bitmap

Votre activité principale

private ImageView profilePicture 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_sidebar_menu); 

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
    navigationView.setNavigationItemSelectedListener(this); 

    View headerView = navigationView.getHeaderView(0); 

    User u = MainProvider.sharedInstance().getCurrentUser(this); 
    TextView usernameText = (TextView) headerView.findViewById(R.id.usernameText); 

    profilePicture = (ImageView)headerView.findViewById(R.id.profilePicture); 
    String profilePictureUrl = u.getSettings().get("profile_picture").getAsString(); 
    new convertUrlToBitmap().execute(profilePictureUrl); 
    profilePicture.setImageBitmap(); 
} 

Votre sur PostExecute

protected void onPostExecute(Bitmap myBitmap) { 
    // TODO: check this.exception 
    // TODO: do something with the feed 
    profilePicture.setImageBitmap(myBitmap) 
} 

Note: Au lieu de télécharger en utilisant HttpURLConnection vous pouvez utiliser Glide lib, doc officiel Android a également recommandé d'utiliser Glide

En utilisant Glide vous pouvez utiliser comme ça,

Glide.with(this).load(profilePictureUrl).diskCacheStrategy(DiskCacheStrategy.ALL).placeholder(R.drawable.ic_user).into(profilePicture); 
0

Vous pouvez créer un rappel d'interface avec une méthode onBitmapLoaded et utiliser cette interface comme param de votre AsyncTask. Mais sachez que pour le chargement d'images, vous pouvez utiliser des bibliothèques tierces comme Picasso ou Glide qui sont exactement conçues pour la recherche d'images asynchrones, très bien documentées et faciles à utiliser.

http://square.github.io/picasso/

https://github.com/bumptech/glide

0

Définir des vues dans la méthode postExecute de AsyncTask comme il fonctionne en thread d'interface utilisateur. Vous avez déjà renvoyé bitmap dans la méthode post execute, vous n'avez donc qu'à faire ce changement. Ceci est prévu que votre asynctask est dans votre activité.

class convertUrlToBitmap extends AsyncTask<String, Void, Bitmap> { 

private Exception exception; 

protected Bitmap doInBackground(String... urls) { 
    try { 
     URL url = new URL(urls[0]); 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
     connection.setDoInput(true); 
     connection.connect(); 
     InputStream input = connection.getInputStream(); 
     Bitmap myBitmap = BitmapFactory.decodeStream(input); 
     connection.disconnect(); 
     return myBitmap; 
    } catch (IOException e) { 
     // Log exception 
     return null; 
    } 
} 

protected void onPostExecute(Bitmap myBitmap) { 
    // TODO: check this.exception 
    // TODO: do something with the feed 

     profilePicture.setImageBitmap(myBitmap) 

} 

}

Un autre très facile et solution efficace est d'utiliser la bibliothèque Picasso ou Glide puisque vous avez déjà l'image url. Cela réduira votre travail en créant asynctask. Ajoutez simplement cette bibliothèque dans votre gradle.

compile 'com.squareup.picasso:picasso:2.5.2' 

et de faire cette modification dans votre activité.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_sidebar_menu); 

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
    navigationView.setNavigationItemSelectedListener(this); 

    View headerView = navigationView.getHeaderView(0); 

    User u = MainProvider.sharedInstance().getCurrentUser(this); 
    TextView usernameText = (TextView) headerView.findViewById(R.id.usernameText); 

    ImageView profilePicture = (ImageView)headerView.findViewById(R.id.profilePicture); 
    String profilePictureUrl = u.getSettings().get("profile_picture").getAsString(); 
    Picasso.with(this) 
     .load(profilePictureUrl) 
     .placeHolder(defaultPicId) //this image will display until your result image is ready 
     .error(defaultErrorPicId) //this image will display in case of error. 
     .into(profilePicture) 
} 

Je recommande fortement d'utiliser la bibliothèque picasso dans votre cas.