Skip to content

Instantly share code, notes, and snippets.

@gordinmitya
Last active June 3, 2020 08:59
Show Gist options
  • Save gordinmitya/95dea1d70420a1ad75e2b0a8aa3f793a to your computer and use it in GitHub Desktop.
Save gordinmitya/95dea1d70420a1ad75e2b0a8aa3f793a to your computer and use it in GitHub Desktop.
Try to stop a Thread in Android

Approach with ExecutorService and Future.get(timeout)

Result Future throws exception to the caller, not to an Executor. while (true) { } continues to work.

"методом submit(Runnable) у ExecutedService получить Future и вызвать get c передачей максимального времени ожидания. Это все в try catch. То есть изначально стартовать с таймаутом."

....................
2020-06-03 11:35:10.481 31097-31137/com.example.myapplication D/STOPME: tik-tok
2020-06-03 11:35:12.661 31097-31137/com.example.myapplication I/chatty: uid=10471(com.example.myapplication) pool-1-thread-1 identical 9828 lines
2020-06-03 11:35:12.661 31097-31137/com.example.myapplication D/STOPME: tik-tok
2020-06-03 11:35:12.661 31097-31137/com.example.myapplication D/STOPME: tik-tok
2020-06-03 11:35:13.589 31097-31137/com.example.myapplication I/chatty: uid=10471(com.example.myapplication) pool-1-thread-1 identical 4247 lines
2020-06-03 11:35:13.589 31097-31137/com.example.myapplication D/STOPME: tik-tok
2020-06-03 11:35:13.590 31097-31097/com.example.myapplication D/STOPME: got exception
java.util.concurrent.TimeoutException
at java.util.concurrent.FutureTask.get(FutureTask.java:206)
at com.example.myapplication.MainActivity.onCreate(MainActivity.kt:22)
at android.app.Activity.performCreate(Activity.java:7894)
at android.app.Activity.performCreate(Activity.java:7881)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1307)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3279)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3443)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2040)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:224)
at android.app.ActivityThread.main(ActivityThread.java:7520)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
2020-06-03 11:35:13.591 31097-31097/com.example.myapplication W/Activity: Slow Operation: Activity com.example.myapplication/.MainActivity onCreate took 5035ms
2020-06-03 11:35:13.591 31097-31137/com.example.myapplication D/STOPME: tik-tok
2020-06-03 11:35:13.610 31097-31137/com.example.myapplication I/chatty: uid=10471(com.example.myapplication) pool-1-thread-1 identical 71 lines
2020-06-03 11:35:13.610 31097-31137/com.example.myapplication D/STOPME: tik-tok
2020-06-03 11:35:13.610 31097-31137/com.example.myapplication D/STOPME: tik-tok
2020-06-03 11:35:13.611 31097-31097/com.example.myapplication W/Looper: Slow Looper main: Long Msg: seq=3 plan=11:35:08.510 late=30ms wall=5070ms running=56ms runnable=7ms h=android.app.ActivityThread$H w=159
2020-06-03 11:35:13.611 31097-31137/com.example.myapplication D/STOPME: tik-tok
2020-06-03 11:35:13.611 31097-31097/com.example.myapplication W/Looper: Slow Looper main: Activity com.example.myapplication/.MainActivity is 5101ms late (wall=0ms running=0ms ClientTransaction{ callbacks=[android.app.servertransaction.TopResumedActivityChangeItem] }) because of 2 msg, msg 1 took 74ms (seq=2 running=60ms runnable=3ms late=1ms h=android.app.ActivityThread$H w=110), msg 2 took 5070ms (seq=3 running=56ms runnable=7ms late=30ms h=android.app.ActivityThread$H w=159)
2020-06-03 11:35:13.630 31097-31137/com.example.myapplication I/chatty: uid=10471(com.example.myapplication) pool-1-thread-1 identical 73 lines
2020-06-03 11:35:13.630 31097-31137/com.example.myapplication D/STOPME: tik-tok
2020-06-03 11:35:13.630 31097-31137/com.example.myapplication D/STOPME: tik-tok
2020-06-03 11:35:13.630 31097-31137/com.example.myapplication I/chatty: uid=10471(com.example.myapplication) pool-1-thread-1 identical 1 line
2020-06-03 11:35:13.631 31097-31137/com.example.myapplication D/STOPME: tik-tok
....................
package com.example.myapplication
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors
import java.util.concurrent.TimeUnit
import java.util.concurrent.TimeoutException
class MainActivity : AppCompatActivity() {
val TAG = "STOPME"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
try {
Executors
.newSingleThreadExecutor()
.submit(runnable)
.get(5, TimeUnit.SECONDS)
} catch (e: TimeoutException) {
Log.d(TAG, "got exception", e)
}
}
private val runnable = Runnable {
while (true) {
for (i in 1 until 100_500)
if (i == 1)
Log.d(TAG, "tik-tok")
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment