【问题标题】:How to get values from an AsyncTask when it is in another class当它在另一个类中时如何从 AsyncTask 获取值
【发布时间】:2020-04-03 07:47:37
【问题描述】:

我需要从我的 AsyncTask 中获取结果。我实际上可以从任务中得到结果,但我只是不知道如何从需要它的方法中得到它。正如将要看到的,AsyncTask 属于不同的类。如果您有任何问题,我可以澄清一下,请告诉我,以便我可以编辑帖子。请参阅下面的代码:

public class UserRepository {
    private UserDao userDao;
    private User user;
    private LiveData<List<User>> allUsers;

    public UserRepository(Application application) {
        AtsDatabase database = AtsDatabase.getInstance(application);
        userDao = database.userDao();
        allUsers = userDao.getUsers();
    }

 private MutableLiveData<User> userSearched = new MutableLiveData<>();
 private void asyncFinished(User userResult) {
    if(userResult == null) return;
    Log.i("TAG", "asyncFinished: " + userResult.getLastName());
    userSearched.setValue(userResult);
 }

    public LiveData<User> getUserByUserName(String userName) {
        new GetUserByUserNameAsyncTask(userDao).execute(userName); ===> I NEED THE RESULT HERE SO I CAN PASS IT TO MY VIEW MODEL
    }

    public LiveData<List<User>> getAllUsers() { return allUsers; }

    private static class InsertUserAsyncTask extends AsyncTask<User, Void, Void> {
        private UserDao userDao;

        private InsertUserAsyncTask(UserDao userDao) { this.userDao = userDao; }

        @Override
        protected Void doInBackground(User... users) {
            userDao.insert(users[0]);
            return null;
        }
    }

    private static class GetUserByUserNameAsyncTask extends AsyncTask<String, Void, User> {
        private LiveData<User> user;
        private UserDao userDao;

        private GetUserByUserNameAsyncTask(UserDao userDao) { this.userDao = userDao; }

        @Override
        protected User doInBackground(String... strings) {
             user = userDao.getUserByUserName(strings[0]); ======> I GET RESULT HERE 
             return null;
        }

         @Override
        protected void onPostExecute(User user) {
        super.onPostExecute(user);
        Log.i("TAG", "onPostExecute: "+user.getLastName());
        delegate.asyncFinished(user);
    }
    }
}

我该如何做到这一点?谢谢。

【问题讨论】:

    标签: java android android-room


    【解决方案1】:

    首先,AsyncTask 现在已弃用。

    如果您仍想使用它,请创建一个MutableLiveData 并 在暴露的函数中将其作为LiveData 返回,然后通过AsyncTask 的构造函数将其传递。 得到结果后使用MutableLiveDatapostValue方法设置结果。

    【讨论】:

    • 既然 AsyncTask 是 depectated,那我应该用什么来代替它呢?
    • 考虑使用 java.util.concurrent 包中的方法(或者如果你想切换到 Kotlin,则使用协程),如文档中所述:developer.android.com/reference/android/os/AsyncTask
    • 我可以在 Kotlin 中做到这一点。我正在尝试用 Java 来实现。我会试试并发的。
    • 我已将我的问题更新为您在 asynctask 上的建议。我在 onPostExecute 上收到错误 Attempt to invoke direct method 'void UserRepository.asyncFinished(com.ats.atsver2.ui.db.classes.User)' on a null object reference
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多