Looking for resources that teach multithreading in Android and list best practices. I want to do some image processing on the preview frame of the camera (already have this part set up) but want to parallelize the processing. Results from the async processes should come back to the main thread and update the UI.
I'm confused about how the following classes work together:
Thread
HandlerThread
Handler
Looper
Here's what I understand so far:
Threads can be used in different ways
- A class that implements the
Runnableinterface - Using the
Threadconstructor and passing it an instance ofRunnable,new Thread(new CustomRunnable()) - Subclassing
Threadand overridingrun
- A class that implements the
Handlers are linked to a Looper on the thread where the Handler is instantiated. A looper contains a Message Queue which contain the results of the Threads. The messages are consumed by the calling thread's looper.
You are allowed to create your own Looper - why would you want to do this?
Some questions:
If a phone has 4 cores, and one thread is the UI thread can I run only 3 other processes in parallel ?
If I spawn threads at a high rate, say 30 times a second, is there such a thing as "running out of threads" ? Does Android handle the queueing of multiple threads? I'm imagining Android as a starter of a race with a checkered flag, the cars being the
Runnables queued up to race, and the starter only lets 4Runnables go at a time. Not sure if this is a correct assumption.Do Android devices utilize virtual cores? How do I know how many virtual cores a device has, and how do I control them? Are there different ways to implement virtual cores, and is thread switching one of them?
Thanks for any guidance!