20

I'm making a custom ImageView . One of the methods is to load an image from a URL. And I want to retrieve the Bitmap in a Thread and load the bitmap in the UI thread.

How can I make a runOnUIThread() call for painting the bitmap?

Is there some kind of built in function? Or should I create a Handler in the constructor and use it for running runnables in the UI thread?

pb2q
  • 58,613
  • 19
  • 146
  • 147
Addev
  • 31,819
  • 51
  • 183
  • 302

3 Answers3

55

Download the Image via AsyncTask and set to your view in its onPostExecute method

OR

From a separate image downloading thread use the post method of View which will always run its Runnable on UI-thread:

yourImageView.post(new Runnable() {
    @Override
    public void run() {
        // set the downloaded image here

    }
});
waqaslam
  • 67,549
  • 16
  • 165
  • 178
7

You can do something like this:

 new Thread(new Runnable() {
   public void run() {
     final Bitmap bm = getBitmapFromURL(myStation.getStation().imageURL);
     ((Activity) context).runOnUiThread(new Runnable() {
       public void run() {
         icon.setImageBitmap(bm);
       }
     });
   }
 }).start();

This will work outside of an activity, like in a ListAdapter.

IgorGanapolsky
  • 26,189
  • 23
  • 116
  • 147
2

Create a class that extends from AsyncTask. Pass the ImageView in the constructor. In the doInBackground method, download the image. In the postExecute method, set the image to the ImageView.

Charlie-Blake
  • 10,832
  • 13
  • 55
  • 90