From 4ce0f887e20db79ed5ee2aba71af6fcc7cf25cc3 Mon Sep 17 00:00:00 2001 From: Omer Iyioz Date: Sun, 21 Jun 2020 16:30:59 +0300 Subject: [PATCH 1/5] added numbers to logs to show order of execution --- .../chapter5_viewmodel/CoroutinesViewModel.kt | 86 +++++++++---------- 1 file changed, 41 insertions(+), 45 deletions(-) diff --git a/Tutorial1-1CoroutinesBasics/src/main/java/com/smarttoolfactory/tutorial1_1coroutinesbasics/chapter5_viewmodel/CoroutinesViewModel.kt b/Tutorial1-1CoroutinesBasics/src/main/java/com/smarttoolfactory/tutorial1_1coroutinesbasics/chapter5_viewmodel/CoroutinesViewModel.kt index 9df081e..5719100 100644 --- a/Tutorial1-1CoroutinesBasics/src/main/java/com/smarttoolfactory/tutorial1_1coroutinesbasics/chapter5_viewmodel/CoroutinesViewModel.kt +++ b/Tutorial1-1CoroutinesBasics/src/main/java/com/smarttoolfactory/tutorial1_1coroutinesbasics/chapter5_viewmodel/CoroutinesViewModel.kt @@ -44,24 +44,24 @@ class CoroutinesViewModel(private val viewModelDispatcher: CoroutineDispatcher) fun getMockResult(timeMillis: Long = 2000) { - println("getMockResult() loading...") + println("1 - getMockResult() loading...") result.value = "Loading..." enableResultButton.value = false viewModelScope.launch { - println("πŸ™„ getMockResult() START ViewModel scope: $this, thread: ${Thread.currentThread().name}") + println("πŸ™„ 2 - getMockResult() START ViewModel scope: $this, thread: ${Thread.currentThread().name}") - result.value = generateMockNetworkResponseOrThrowException(timeMillis) + result.value = generateMockNetworkResponseOrThrowException(timeMillis) // 4 enableResultButton.value = true - println("getMockResult() ViewModel scope AFTER generateMockNetworkResponse() ${result.value}") + println("5 - getMockResult() ViewModel scope AFTER generateMockNetworkResponse() ${result.value}") } - println("getMockResult() END OF FUN") + println("3 - getMockResult() END OF FUN") - /* + /* 1 2 4 3 5 Prints: I: getMockResult() loading... I: πŸ™„ getMockResult() ViewModel scope: StandaloneCoroutine{Active}@ef7c60d, thread: main @@ -72,55 +72,45 @@ class CoroutinesViewModel(private val viewModelDispatcher: CoroutineDispatcher) } - - /** - * This method is for Unit-Testing exceptions + /* + Mock Response Functions */ - @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) - fun throwExceptionInAScope(coroutineContext: CoroutineContext) { - - println("getMockResult() loading...") - // πŸ”₯πŸ”₯ - viewModelScope.launch(coroutineContext) { - - println("πŸ™„ getMockResult() START ViewModel scope: $this, thread: ${Thread.currentThread().name}") - - delay(2000) - throw RuntimeException("Exception Occurred") + private suspend fun generateMockNetworkResponseOrThrowException(timeMillis: Long = 2000): String { - } + println("πŸ₯Ά 4 - generateMockNetworkResponse() thread: ${Thread.currentThread().name}") - println("getMockResult() END OF FUN") + delay(timeMillis) + if (timeMillis > 2000) throw RuntimeException("Threw Network Exception") + return "Hello World" } - fun getMockResultFromDispatcherThread(timeMillis: Long) { - println("getMockResult() loading...") + println("1 - getMockResult() loading...") result.value = "Loading..." enableResultButton.value = false viewModelScope.launch(Dispatchers.Default) { - println("πŸ™„ getMockResult() ViewModel scope: $this, thread: ${Thread.currentThread().name}") + println("πŸ™„ 3 - getMockResult() ViewModel scope: $this, thread: ${Thread.currentThread().name}") withContext(Dispatchers.Main) { - result.value = generateMockNetworkResponseOrThrowException(timeMillis) + result.value = generateMockNetworkResponseOrThrowException(timeMillis) // 4 enableResultButton.value = true } - println("getMockResult() ViewModel scope AFTER") + println("5 - getMockResult() ViewModel scope AFTER") } - println("getMockResult() END OF FUN") + println("2 - getMockResult() END OF FUN") /* - Prints: + Prints: 1 3 2 4 5 or 1 2 3 4 5 */ @@ -283,21 +273,6 @@ class CoroutinesViewModel(private val viewModelDispatcher: CoroutineDispatcher) } - /* - Mock Response Functions - */ - - private suspend fun generateMockNetworkResponseOrThrowException(timeMillis: Long = 2000): String { - - println("πŸ₯Ά generateMockNetworkResponse() thread: ${Thread.currentThread().name}") - - delay(timeMillis) - - if (timeMillis > 2000) throw RuntimeException("Threw Network Exception") - - return "Hello World" - } - private suspend fun generateRandomCity(): String { val cityList = listOf("Berlin", "New York", "London", "Paris", "Istanbul") @@ -317,9 +292,30 @@ class CoroutinesViewModel(private val viewModelDispatcher: CoroutineDispatcher) } + /** + * This method is for Unit-Testing exceptions + */ + @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) + fun throwExceptionInAScope(coroutineContext: CoroutineContext) { + + println("getMockResult() loading...") + + // πŸ”₯πŸ”₯ + viewModelScope.launch(coroutineContext) { + + println("πŸ™„ getMockResult() START ViewModel scope: $this, thread: ${Thread.currentThread().name}") + + delay(2000) + throw RuntimeException("Exception Occurred") + + } + + println("getMockResult() END OF FUN") + + } } -class CoroutinesViewModelFactory() : +class CoroutinesViewModelFactory : ViewModelProvider.Factory { override fun create(modelClass: Class): T { From 44e7bbec5e510fa321c595339464e1e06d30478b Mon Sep 17 00:00:00 2001 From: Omer Iyioz Date: Sun, 21 Jun 2020 16:54:40 +0300 Subject: [PATCH 2/5] added number to logs --- .../chapter5_viewmodel/CoroutinesViewModel.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tutorial1-1CoroutinesBasics/src/main/java/com/smarttoolfactory/tutorial1_1coroutinesbasics/chapter5_viewmodel/CoroutinesViewModel.kt b/Tutorial1-1CoroutinesBasics/src/main/java/com/smarttoolfactory/tutorial1_1coroutinesbasics/chapter5_viewmodel/CoroutinesViewModel.kt index 5719100..a447791 100644 --- a/Tutorial1-1CoroutinesBasics/src/main/java/com/smarttoolfactory/tutorial1_1coroutinesbasics/chapter5_viewmodel/CoroutinesViewModel.kt +++ b/Tutorial1-1CoroutinesBasics/src/main/java/com/smarttoolfactory/tutorial1_1coroutinesbasics/chapter5_viewmodel/CoroutinesViewModel.kt @@ -145,9 +145,9 @@ class CoroutinesViewModel(private val viewModelDispatcher: CoroutineDispatcher) // longer than 2000 ms resultWithTimeout.value = generateMockNetworkResponseOrThrowException() } catch (exception: TimeoutCancellationException) { - resultWithTimeout.value = exception.message + resultWithTimeout.value = "1 - " + exception.message } catch (exception: Exception) { - resultWithTimeout.value = exception.message + resultWithTimeout.value = "2 - " + exception.message } } From f6de1ab445f7784af8eb4c81fc4c808f549d496a Mon Sep 17 00:00:00 2001 From: Omer Iyioz Date: Wed, 8 Jul 2020 12:16:23 +0300 Subject: [PATCH 3/5] added lifecycleScope example --- .../src/main/AndroidManifest.xml | 3 +- .../MainActivity.kt | 2 + .../Activity3LifecycleScope.kt | 55 +++++++++++++++++++ .../res/layout/activity3_lifecycle_scope.xml | 38 +++++++++++++ 4 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 Tutorial1-1CoroutinesBasics/src/main/java/com/smarttoolfactory/tutorial1_1coroutinesbasics/chapter3_lifecycle/Activity3LifecycleScope.kt create mode 100644 Tutorial1-1CoroutinesBasics/src/main/res/layout/activity3_lifecycle_scope.xml diff --git a/Tutorial1-1CoroutinesBasics/src/main/AndroidManifest.xml b/Tutorial1-1CoroutinesBasics/src/main/AndroidManifest.xml index 5bdf1e7..bf0381e 100644 --- a/Tutorial1-1CoroutinesBasics/src/main/AndroidManifest.xml +++ b/Tutorial1-1CoroutinesBasics/src/main/AndroidManifest.xml @@ -2,7 +2,7 @@ - + + diff --git a/Tutorial1-1CoroutinesBasics/src/main/java/com/smarttoolfactory/tutorial1_1coroutinesbasics/MainActivity.kt b/Tutorial1-1CoroutinesBasics/src/main/java/com/smarttoolfactory/tutorial1_1coroutinesbasics/MainActivity.kt index 60d1686..4dfe255 100644 --- a/Tutorial1-1CoroutinesBasics/src/main/java/com/smarttoolfactory/tutorial1_1coroutinesbasics/MainActivity.kt +++ b/Tutorial1-1CoroutinesBasics/src/main/java/com/smarttoolfactory/tutorial1_1coroutinesbasics/MainActivity.kt @@ -17,6 +17,7 @@ import com.smarttoolfactory.tutorial1_1coroutinesbasics.chapter2_scopes.Activity import com.smarttoolfactory.tutorial1_1coroutinesbasics.chapter2_scopes.Activity2CoroutineScope3 import com.smarttoolfactory.tutorial1_1coroutinesbasics.chapter2_scopes.Activity2CoroutineScope4 import com.smarttoolfactory.tutorial1_1coroutinesbasics.chapter3_lifecycle.Activity3CoroutineLifecycle +import com.smarttoolfactory.tutorial1_1coroutinesbasics.chapter3_lifecycle.Activity3LifecycleScope import com.smarttoolfactory.tutorial1_1coroutinesbasics.chapter4_supervisorjob.Activity4SupervisorJob import com.smarttoolfactory.tutorial1_1coroutinesbasics.chapter5_viewmodel.Activity5ViewModelRxJava import com.smarttoolfactory.tutorial1_1coroutinesbasics.chapter5_viewmodel.Activity5ViewModelScope @@ -47,6 +48,7 @@ class MainActivity : AppCompatActivity(), BaseAdapter.OnRecyclerViewItemClickLis activityClassModels.add(ActivityClassModel(Activity2CoroutineScope3::class.java)) activityClassModels.add(ActivityClassModel(Activity2CoroutineScope4::class.java)) activityClassModels.add(ActivityClassModel(Activity3CoroutineLifecycle::class.java)) + activityClassModels.add(ActivityClassModel(Activity3LifecycleScope::class.java)) activityClassModels.add(ActivityClassModel(Activity4SupervisorJob::class.java)) activityClassModels.add(ActivityClassModel(Activity5ViewModelScope::class.java)) activityClassModels.add(ActivityClassModel(Activity5ViewModelRxJava::class.java)) diff --git a/Tutorial1-1CoroutinesBasics/src/main/java/com/smarttoolfactory/tutorial1_1coroutinesbasics/chapter3_lifecycle/Activity3LifecycleScope.kt b/Tutorial1-1CoroutinesBasics/src/main/java/com/smarttoolfactory/tutorial1_1coroutinesbasics/chapter3_lifecycle/Activity3LifecycleScope.kt new file mode 100644 index 0000000..c699568 --- /dev/null +++ b/Tutorial1-1CoroutinesBasics/src/main/java/com/smarttoolfactory/tutorial1_1coroutinesbasics/chapter3_lifecycle/Activity3LifecycleScope.kt @@ -0,0 +1,55 @@ +package com.smarttoolfactory.tutorial1_1coroutinesbasics.chapter3_lifecycle + +import android.os.Bundle +import android.widget.Toast +import androidx.appcompat.app.AlertDialog +import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.lifecycleScope +import com.smarttoolfactory.tutorial1_1basics.R +import com.smarttoolfactory.tutorial1_1basics.databinding.Activity3LifecycleScopeBinding +import com.smarttoolfactory.tutorial1_1coroutinesbasics.util.dataBinding +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch + +/* +* +* */ + +class Activity3LifecycleScope : AppCompatActivity(R.layout.activity3_lifecycle_scope) { + + private val binding: Activity3LifecycleScopeBinding by dataBinding() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + val builder = AlertDialog.Builder(this) + builder.setMessage("Mesajj") + builder.setTitle("Titlee") + val alertDialog = builder.create() + + + binding.button1.setOnClickListener { + binding.textViewResult.text = binding.textViewResult.text.toString() + "Clicked\n" + lifecycleScope.launch { + + binding.textViewResult.text = + binding.textViewResult.text.toString() + "πŸ€“ Delay 5 sn before showing dialog\n" + delay(5000) + + alertDialog.show() + + binding.textViewResult.text = + binding.textViewResult.text.toString() + "πŸ₯³ Delay 5 sn after showing dialog\n" + delay(5000) + + binding.textViewResult.text = + binding.textViewResult.text.toString() + "Dismissed AlertDialog \n" + Toast.makeText(baseContext, "Dismissed AlertDialog", Toast.LENGTH_SHORT).show() + alertDialog.dismiss() + } + binding.textViewResult.text = + binding.textViewResult.text.toString() + "πŸš—πŸš—πŸš— Codes after lifecycleScope \n" + } + + } +} \ No newline at end of file diff --git a/Tutorial1-1CoroutinesBasics/src/main/res/layout/activity3_lifecycle_scope.xml b/Tutorial1-1CoroutinesBasics/src/main/res/layout/activity3_lifecycle_scope.xml new file mode 100644 index 0000000..01aa638 --- /dev/null +++ b/Tutorial1-1CoroutinesBasics/src/main/res/layout/activity3_lifecycle_scope.xml @@ -0,0 +1,38 @@ + + + + + + + + + +