Kotlin 的 Coroutines 与 Android 中的 Java Executor 有何不同?
我是一名从Java切换到Kotlin的Android开发人员,我计划使用协程来处理异步代码,因为它看起来非常有前途。
回到Java中,为了处理异步代码,我使用该类在另一个线程中执行一段耗时的代码,远离UI线程。我有一个类,我在我的类中注入了一组.它看起来像这样:Executor
AppExecutors
xxxRepository
Executor
public class AppExecutors
{
private static class DiskIOThreadExecutor implements Executor
{
private final Executor mDiskIO;
public DiskIOThreadExecutor()
{
mDiskIO = Executors.newSingleThreadExecutor();
}
@Override
public void execute(@NonNull Runnable command)
{
mDiskIO.execute(command);
}
}
private static class MainThreadExecutor implements Executor
{
private Handler mainThreadHandler = new Handler(Looper.getMainLooper());
@Override
public void execute(@NonNull Runnable command)
{
mainThreadHandler.post(command);
}
}
private static volatile AppExecutors INSTANCE;
private final DiskIOThreadExecutor diskIo;
private final MainThreadExecutor mainThread;
private AppExecutors()
{
diskIo = new DiskIOThreadExecutor();
mainThread = new MainThreadExecutor();
}
public static AppExecutors getInstance()
{
if(INSTANCE == null)
{
synchronized(AppExecutors.class)
{
if(INSTANCE == null)
{
INSTANCE = new AppExecutors();
}
}
}
return INSTANCE;
}
public Executor diskIo()
{
return diskIo;
}
public Executor mainThread()
{
return mainThread;
}
}
然后我能够在我的:xxxRepository
executors.diskIo().execute(() ->
{
try
{
LicensedUserOutput license = gson.fromJson(Prefs.getString(Constants.SHAREDPREF_LICENSEINFOS, ""), LicensedUserOutput.class);
/**
* gson.fromJson("") returns null instead of throwing an exception as reported here :
* https://github.com/google/gson/issues/457
*/
if(license != null)
{
executors.mainThread().execute(() -> callback.onUserLicenseLoaded(license));
}
else
{
executors.mainThread().execute(() -> callback.onError());
}
}
catch(JsonSyntaxException e)
{
e.printStackTrace();
executors.mainThread().execute(() -> callback.onError());
}
});
它工作得非常好,谷歌甚至在他们的许多Github Android存储库示例中也有类似的东西。
所以我使用回调。但现在我厌倦了嵌套的回调,我想摆脱它们。为此,我可以写在我的例如:xxxViewModel
executors.diskIo().execute(() ->
{
int result1 = repo.fetch();
String result2 = repo2.fetch(result1);
executors.mainThread().execute(() -> myLiveData.setValue(result2));
});
这种用法与 Kotlin 的协程用法有何不同?据我所知,他们最大的优势是能够以顺序代码样式使用异步代码。但是我能够使用 来做到这一点,正如您从上面的代码示例中看到的那样。那么我在这里错过了什么?从切换到协程可以获得什么?Executor
Executor