我是 Kotlin 协程的新手,并试图了解监督。正如文档所说:
子节点的失败或取消不会导致主管作业失败,也不会影响其其他子节点。
好的,我已经为 JVM 编写了以下代码:
@JvmStatic
fun main(args: Array<String>) = runBlocking {
val supervisorScope = CoroutineScope(Dispatchers.Default + SupervisorJob())
// Coroutine #1
supervisorScope.launch {
println("Coroutine #1 start")
delay(100)
throw RuntimeException("Coroutine #1 failure")
}
// Coroutine #2
supervisorScope.launch {
for (i in 0 until 5) {
println("Coroutine #2: $i")
delay(100)
}
}
supervisorScope.coroutineContext[Job]!!.children.forEach { it.join() }
}
Run Code Online (Sandbox Code Playgroud)
这里一切都很好,Coroutine #1
失败既不会影响父级,也不会影响Coroutine #2
. 这就是监督的目的。输出与文档一致:
Coroutine #1 start
Coroutine #2: 0
Coroutine #2: 1
Exception in thread "DefaultDispatcher-worker-1" java.lang.RuntimeException: Coroutine …
Run Code Online (Sandbox Code Playgroud) 问题是我尝试使用Dagger 2进行字段注入,但在运行时字段,应注入,始终是null
.我也尝试使用MVVM模式.这是我的代码:
ProfileActivity.java:
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "ProfileActivity: onStart: ");
final ProfileViewModel profileViewModel
= ViewModelProviders.of(this).get(ProfileViewModel.class);
profileViewModel.init();
profileViewModel.getUser().observe(this, new Observer<User>() {
@Override
public void onChanged(@Nullable User user) {
if (user != null) {
Log.d(TAG, "ProfileActivity: onStart: " + user.toString());
} else {
Log.d(TAG, "ProfileActivity: onStart: user == null");
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
ProfileViewModel.java:
public class ProfileViewModel extends ViewModel {
private LiveData<User> user;
@Inject
UserRepository userRepository;
public ProfileViewModel() {
Log.d(TAG, "ProfileViewModel: Constructor: ");
}
public void init() …
Run Code Online (Sandbox Code Playgroud)