0

right now I have a LocationAdapter class that takes in my "Location" object and displays each Location into a ListView. I am trying to pass it in a Bitmap image and have it display that image in the ListView row. It works, BUT the image takes a while to load, even after the text in the row is loaded. I am testing on an actual device. Here is my Activity code:

public class MainActivity extends ActionBarActivity { ArrayList<Location> arrayOfLocations; LocationAdapter adapter; private static Bitmap bitmap; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.activity_main); // Construct the data source arrayOfLocations = new ArrayList<Location>(); // Create the adapter to convert the array to views adapter = new LocationAdapter(this, arrayOfLocations); Bitmap image = getBitmapFromID(1); adapter.add(new Location(image, "Place 1", "We have the freshest fruit in the whole world!", "2 miles", "8-5 mon-sat\nclosed sun")); adapter.add(new Location(image, "Place 2", "We have the freshest fruit in the whole world!", "2 miles", "8-5 mon-sat")); adapter.add(new Location(image, "Place 3", "We have the best cakes in the whole world!", "2 miles", "8-5 mon-fri\n10-1 sat\nclosed sun\nclosed Memorial Day")); adapter.add(new Location(image, "Fruit Stand", "Best place!", "2 miles", "8-5 mon-sat")); adapter.add(new Location(image, "Place 4", "Food!", "2 miles", "8-5 mon-sat")); adapter.add(new Location(image, "Place 5", "Toys!", "2 miles", "8-5 mon-sat")); // Attach the adapter to a ListView ListView listView = (ListView) findViewById(R.id.listView1); View header = (View) getLayoutInflater().inflate( R.layout.listview_header, null); listView.addHeaderView(header); listView.setAdapter(adapter); } public static Bitmap getBitmapFromID(int id) { //final Bitmap bitmap; Thread thread = new Thread(new Runnable() { @Override public void run() { try { bitmap = BitmapFactory .decodeStream((InputStream) new URL( "http://icons.iconarchive.com/icons/yellowicon/game-stars/256/Mario-icon.png") .getContent()); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }); thread.start(); return bitmap; } } 

Is there anything I do doing wrong? Is it normal for this to take a while to load? Thanks!

0

3 Answers 3

1

You need to AsyncTask your work in a background thread. However for even better approach, take a look here:

https://stackoverflow.com/a/23941258/276949

Android Volley is a fairly new non-verbose library from Google that works extremely well for loading images, and takes care of handling all downloads on separate threads automatically.

Sign up to request clarification or add additional context in comments.

1 Comment

AsyncTask is the way I went and it works now. Thank you!
0

The loading of the bitmap can take a while as you can read here: Android doc. However you need to sync your thread because after you call start() the method return immediately. You need to receive a "hey I'm done" from your thread, and then load the bitmap.

3 Comments

Ok, so you're saying I need to wait until the thread is finished before returning the bitmap?
Yep, you need to wait.
You need to wait, but you cannot wait in UI thread so for example you can use an alert dialog with indeterminate spinner until the thread ends or use a temp image in your adapter, change the image when done and call notifyOnDataSetChange().
0

Can you have the Mario_icon.png placed INSIDE of your app instead of being accessed from a URL? That way, the app will take less time retrieving the image and it will allow the app to require less permissions

It takes much longer to load an image when you need to connect to a URL.

1 Comment

The app will be accessing a database which will often be adding new images/locations. So I can't have them stored inside the app

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.