I have some kotlin code like the following in an android app:
Thread(Runnable {
while (true) {
Thread.sleep(100)
... do useful work ...
if (checkCurrentCondition()) {
... do final useful work ...
return
}
}
}).start()
Here is my question: Is there some way (a callback function or some other mechanism) by which I can know in the main thread, that the background thread above has finished its job?
CodePudding user response:
You may use AsyncTask or ThreadPoolExecutor. AsyncTask has the onPostExecute() method using which you can get the execution result right into UI Thread and do your job after. Also there is Looper/Handler usages for ThreadPoolExecutor to communicate between UI/Worker threads.
For detailed information's look here
CodePudding user response:
If this is in an Activity
, you could call runOnUiThread { doWhatever() }
from the Thread
- it'll hold a reference to the Activity
, so don't do this in a long-running thread.
If you create a Handler
with Handler(Looper.getMainLooper())
then you can post
Runnable
s to it - basically the same as runOnUiThread
except you're not holding onto an Activity, and you can do things like delay and cancel those posted messages.
If you already have some looping activity going on (so you can basically check if the thread's completed) then you could do anything from having a boolean done
flag that the thread sets (make it @Volatile
so the main thread sees the change) to all the stuff in java.util.concurrent
like Future
s and the like. Really depends on what you're doing.
Posting a Runnable
to the main thread looper is the easiest general way to make a thing happen. But again, if that thread is creating any data in memory that the main thread needs to see, as always you need to handle synchronization, which is its own topic!