java - 在主代码中使用 AsyncTask 中的变量

标签 java android android-asynctask

<分区>

我想要什么

我正在确定用户是否在我的数据库中。

为此,我查看了网页中的 JSON 响应。这是在内部类中确定的 HasUser哪个extends AsyncTask<String, Void, String> .

这是一个运行后台进程来查找用户。

我想在我的主要方法中得到返回的结果。所以后台进程应该寻找用户,然后是boolean。回到我的主要方法应该是 true如果找到用户。

我做了什么

我在 HasUser 中添加了一个方法类名为 hasUser()它返回是否找到了用户(作为 boolean 值)。该类有一个名为 found 的实例变量这是在 onPostExecute 中分配的方法。

所以在我的main方法中,我执行后台进程,然后赋值是否找到用户的 boolean 值是hasUser.hasUser() .是这样的:

private class HasUser extends AsyncTask<String, Void, String> {

    boolean found = false;

    String user;
    public HasUser(String user) { this.user = user; }

    @Override
    protected String doInBackground(String... params) {
        String result = "";
        // return the JSON string response from webpage
    }

    @Override
    protected void onPostExecute(String result) {
        try {
            // JSON stuff

            if (/*success == 0*/) { // user not found
                found = false;
            } else { // found user
                found = true;
            }
        } catch(JSONException e) {
            // handle exception
        }
    }

    public boolean hasUser() {
        return found;
    }

    @Override protected void onPreExecute() { }
    @Override protected void onProgressUpdate(Void... values) { }
}

然后在我的主要方法中,我尝试获得适当的结果:

public void logIn() {
    HasUser hasUser = new HasUser("username");
    hasUser.execute();
    boolean found = hasUser.hasUser();
}

问题

即使正确找到了用户(通过烘烤成功消息进行验证),found logIn() 中的变量将始终为 false,因为它是在后台进程完成之前分配的。

有什么方法可以确保后台进程在我从中检索变量之前完成(我知道这与后台进程的含义相反)?或者我怎样才能做到这一点?我想要一个 boolean返回我的主要方法以获得正确的结果。

最佳答案

使用监听器接口(interface)传回结果,像这样实现你的AsyncTask:

public class ExampleTask extends AsyncTask<Void, Void, Boolean> {

    public interface TaskListener {
        public void onFinished(boolean success);
    }

    private final TaskListener listener;

    private ExampleTask(TaskListener listener) {
        this.listener = listener;
    }

    @Override
    protected Boolean doInBackground(Void... params) {

        boolean result = doWork();

        return result;
    }

    @Override
    protected void onPostExecute(Boolean result) {
        super.onPostExecute(result);

        if(this.listener != null) {
            this.listener.onFinished(result);
        }
    }
}

你可以这样使用它:

ExampleTask task = new ExampleTask(new ExampleTask.TaskListener() {
    @Override
    public void onFinished(boolean success) {
        // Do whatever you want with the result
    }
});
task.execute();

关于java - 在主代码中使用 AsyncTask 中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24026734/

相关文章:

java - 在 JPA Criteria Builder 中按 Oracle 函数排序

android - 如何在 galaxy 选项卡上调试 android 应用程序

android - 无法继承和覆盖 ArrayAdapter

android - 如何在 asynctask onPostExecute 上从服务器的 imageview 上显示图像?

java - 从动态更新的 Application.properties 中读取

java - 通过 Swing 数据库进行实时搜索(或自动完成)

Android 为发布和调试构建模式添加单独的 google map api key

java - 从 Internet 加载数据时显示进度对话框

android - 从 Volley/AsyncTask 返回值到调用方法

java - 在 Camel 路由中捕获异常和异常的子类