1+ class MainActivity : AppCompatActivity (), Listener {
2+
3+ // reference to task allows to manage it's lifecycle
4+ private var asyncTask : SaferAsyncTask ? = null
5+
6+ override fun onCreate (savedInstanceState : Bundle ? ) {
7+ super .onCreate(savedInstanceState)
8+ setContentView(R .layout.activity_main)
9+
10+ button.setOnClickListener {
11+ // AsyncTask is single shot, so create new task every time
12+ if (asyncTask == null || asyncTask?.status != AsyncTask .Status .RUNNING ) {
13+ asyncTask = SaferAsyncTask (this )
14+ asyncTask?.execute(" url1" , " url2" , " url3" )
15+ }
16+ }
17+ }
18+
19+ override fun onDestroy () {
20+ // stop the task when exit from Activity
21+ if (asyncTask?.status == AsyncTask .Status .RUNNING )
22+ asyncTask?.cancel(true )
23+ super .onDestroy()
24+ }
25+
26+ override fun onStarting () {
27+ // create progress dialog
28+ }
29+
30+ override fun onProgress (progress : Int ) {
31+ // update progress dialog
32+ }
33+
34+ override fun onFinished (result : String ) {
35+ // close progress dialog
36+ // show the result
37+ }
38+
39+ override fun onCancel () {
40+ // close progress dialog
41+ // show error message
42+ }
43+
44+ private class SaferAsyncTask (listener : Listener ) : AsyncTask<String, Int, String>() {
45+
46+ private val reference = WeakReference <Listener >(listener)
47+
48+ override fun onPreExecute () {
49+ reference.get()?.onStarting()
50+ }
51+
52+ override fun doInBackground (vararg params : String ): String {
53+ var total = " "
54+ for ((counter, url) in params.withIndex()) {
55+ val result = " result from : $url \n "
56+ total = total.plus(result)
57+ publishProgress(counter) // inform that some part of full request if completed
58+ }
59+ return total
60+ }
61+
62+ override fun onProgressUpdate (vararg values : Int? ) {
63+ values[0 ]?.let { reference.get()?.onProgress(it) }
64+ }
65+
66+ override fun onPostExecute (result : String ) {
67+ reference.get()?.onFinished(result)
68+ }
69+
70+ override fun onCancelled () {
71+ reference.get()?.onCancel()
72+ }
73+ }
74+ }
75+
76+ private interface Listener {
77+ fun onStarting ()
78+ fun onProgress (progress : Int )
79+ fun onFinished (result : String )
80+ fun onCancel ()
81+ }
0 commit comments