Skip to content

Commit ad10b0a

Browse files
committed
handlerthread code added
1 parent 0b0222e commit ad10b0a

5 files changed

Lines changed: 170 additions & 0 deletions

File tree

handlerthread/HandlerActivity.kt

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
class HandlerActivity : AppCompatActivity() {
2+
3+
val START = 1
4+
val FINISH = 2
5+
6+
val runnable = Runnable {
7+
//some background job
8+
handler.sendMessage(createMessage(FINISH, "result")) //send message to handle action
9+
handler.post {
10+
//do action on UI without message communication
11+
}
12+
}
13+
14+
val thread: Thread = Thread(runnable)
15+
16+
val handler = object: Handler(Looper.getMainLooper()) { //pass Looper of thread owner
17+
override fun handleMessage(msg: Message?) {
18+
super.handleMessage(msg)
19+
if(msg?.what == START && thread.state == Thread.State.NEW) {
20+
thread.start()
21+
}
22+
else if(msg?.what == FINISH) {
23+
//some action with msj.obj result
24+
}
25+
}
26+
}
27+
28+
fun createMessage(what : Int, obj : Any) : Message {
29+
val message = Message()
30+
message.what = what
31+
message.obj = obj
32+
return message
33+
}
34+
35+
override fun onCreate(savedInstanceState: Bundle?) {
36+
super.onCreate(savedInstanceState)
37+
setContentView(R.layout.activity_handler)
38+
39+
button.setOnClickListener {
40+
//instead of direct thread.start() it can be done by sending message
41+
handler.sendEmptyMessage(START)
42+
}
43+
}
44+
45+
override fun onDestroy() {
46+
super.onDestroy()
47+
handler.removeCallbacksAndMessages(null) //remove pending work from MessageQueue
48+
thread.interrupt()
49+
}
50+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
class HandlerThreadActivity : AppCompatActivity() {
2+
3+
//work to do by requestHandler
4+
val runnable = Runnable {
5+
//some background job
6+
responseHandler.sendMessage(Message()) //send message or post the job
7+
responseHandler.post {
8+
//some UI action
9+
}
10+
}
11+
12+
//handler on the main thread, override handleMessage if needed
13+
val responseHandler = object: Handler(Looper.getMainLooper()) {
14+
override fun handleMessage(msg: Message?) {
15+
super.handleMessage(msg)
16+
//some action on UI
17+
}
18+
}
19+
20+
//handler on the background thread of handlerThread object
21+
lateinit var requestHandler: Handler
22+
23+
//instead of Thread use reusable HandlerThread
24+
//this can be also done by extend HandlerThread class and putting there Handler object
25+
val handlerThread = HandlerThread("HandlerThread")
26+
27+
override fun onCreate(savedInstanceState: Bundle?) {
28+
super.onCreate(savedInstanceState)
29+
setContentView(R.layout.activity_handler_thread)
30+
31+
handlerThread.start() //start the thread
32+
requestHandler = Handler(handlerThread.looper) //now Looper of handlerThread can be passed
33+
34+
button.setOnClickListener {
35+
requestHandler.post(runnable) //post the job to MessageQueue
36+
}
37+
}
38+
39+
override fun onDestroy() {
40+
super.onDestroy()
41+
//remove tasks and messages from handlers
42+
requestHandler.removeCallbacksAndMessages(null)
43+
responseHandler.removeCallbacksAndMessages(null)
44+
handlerThread.quitSafely() //quit HandlerThread's Looper
45+
handlerThread.interrupt() //stop current job
46+
}
47+
}

handlerthread/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# handlerthread
2+
This is repository of http://androidcode.pl blog. It shows uses HandlerThread in Android. It is a part of Background processing - HandlerThread post in the blog.

handlerthread/ThreadActivity.kt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
class ThreadActivity : AppCompatActivity() {
2+
3+
val runnable = Runnable {
4+
//some background job
5+
runOnUiThread {
6+
//UI job if needed
7+
}
8+
}
9+
val thread = Thread(runnable) //pass runnable or create anonymous object
10+
11+
override fun onCreate(savedInstanceState: Bundle?) {
12+
super.onCreate(savedInstanceState)
13+
setContentView(R.layout.activity_thread)
14+
15+
button.setOnClickListener {
16+
//do not allow start thread if is started
17+
if(thread.state == Thread.State.NEW)
18+
thread.start()
19+
}
20+
}
21+
22+
override fun onDestroy() {
23+
super.onDestroy()
24+
if(thread.state != Thread.State.TERMINATED)
25+
thread.interrupt() //stop the thread if needed
26+
}
27+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
class ThreadPoolActivity : AppCompatActivity() {
2+
3+
//this ExecutorService is wrapped ThreadPoolExecutor (this class extends ExecutorService)
4+
//equivalent of ThreadPoolExecutor with min and max only 1 thread in pool and LinkedBlockingQueue
5+
val executor : ExecutorService = Executors.newSingleThreadExecutor()
6+
7+
val runnable = Runnable {
8+
//some background job
9+
uiHandler.post {
10+
//some UI job
11+
}
12+
}
13+
14+
val callable = Callable {
15+
//some background job and return result
16+
return@Callable "result"
17+
}
18+
19+
val uiHandler = Handler()
20+
21+
override fun onCreate(savedInstanceState: Bundle?) {
22+
super.onCreate(savedInstanceState)
23+
setContentView(R.layout.activity_thread_pool)
24+
25+
button1.setOnClickListener {
26+
//use executor with Runnable
27+
executor.execute(runnable)
28+
}
29+
30+
button2.setOnClickListener {
31+
//use executor with Callable
32+
val future : Future<String> = executor.submit(callable)
33+
val result = future.get()
34+
//this can be canceled by run future.cancel()
35+
}
36+
}
37+
38+
override fun onDestroy() {
39+
super.onDestroy()
40+
//remove tasks and messages from handlers
41+
uiHandler.removeCallbacksAndMessages(null)
42+
executor.shutdownNow() //kill all threads
43+
}
44+
}

0 commit comments

Comments
 (0)