executor在android体系结构组件中的用法

时间:2018-09-04 11:09:39

标签: android android-architecture-components

public class UserRepository {
private final Webservice webservice;
private final UserDao userDao;
private final Executor executor;

@Inject
public UserRepository(Webservice webservice, UserDao userDao, Executor executor) {
    this.webservice = webservice;
    this.userDao = userDao;
    this.executor = executor;
}

public LiveData<User> getUser(String userId) {
    refreshUser(userId);
    // Returns a LiveData object directly from the database.
    return userDao.load(userId);
}

private void refreshUser(final String userId) {
    // Runs in a background thread.
    executor.execute(() -> {
        // Check if user data was fetched recently.
        boolean userExists = userDao.hasUser(FRESH_TIMEOUT);
        if (!userExists) {
            // Refreshes the data.
            Response<User> response = webservice.getUser(userId).execute();

            // Check for errors here.

            // Updates the database. The LiveData object automatically
            // refreshes, so we don't need to do anything else here.
            userDao.save(response.body());
        }
    });
}
}
上面的

代码是使用体系结构组件的“指南到应用程序体系结构”的一部分。如果没有缓存中的数据,则在refreshUser方法中,他们使用改造从网络中获取数据。

我的问题是:为什么他们为此使用执行器?改造本身已经能够异步运行网络请求。

在我的示例中,请说明究竟是什么执行器及其需求。

2 个答案:

答案 0 :(得分:3)

开箱即用的空间不支持在主线程上进行数据库访问,因此执行程序可以确保在单独的线程上完成工作。

通过使用执行程序,他们还选择使用同步改造调用,这将阻塞执行线程。

在您引用的执行程序的代码中是SingleThreadExecutor,这实际上创建了一个工作线程来执行其工作,在这种情况下,该线程将执行Room DB操作并处理同步改造调用。

在上面的示例中,这是到执行者的链接。 https://github.com/PhilippeBoisney/GithubArchitectureComponents/blob/98e0a048791f18646c730323c242c670c3eaf453/app/src/main/java/com/boisneyphilippe/githubarchitecturecomponents/di/module/AppModule.java#L48

有关newSingleThreadExecutor的官方文档: https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executors.html#newSingleThreadExecutor()

答案 1 :(得分:2)

  

什么是执行者?

通常使用Executor代替显式创建线程。例如,您可以使用:

而不是为一组任务中的每一个调用new Thread(new RunnableTask()).start()
Executor executor = someExecutor();  
executor.execute(new Runnable1());
executor.execute(new Runnable2());
  

为什么他们为此使用执行器?改造本身已经   能够异步运行网络请求。

他们已使用它从主线程切换到后台工作线程来执行数据库操作,因为默认情况下, Room 体系结构组件不允许在MainThread上进行查询。

改造能够执行异步网络请求,但是他们在此处执行同步网络请求,之后,他们只是使用Room组件在本地数据库上执行插入操作。

有关Executor框架的更多信息,您可以按照以下指南进行操作:https://developer.android.com/reference/java/util/concurrent/Executor