在android中使用一个AsyncTask而不是两个AsyncTasks

时间:2013-03-27 09:39:41

标签: android android-asynctask

我有以下场景:在我的应用程序中,我使用AsyncTask A连接到数据库并检查登录。这个AsyncTask的doInBackground方法返回一个布尔值。 对于某些用户交互,我使用AsyncTask B连接到同一个数据库并返回ResultSet。 一切正常,但我只想使用一个AsyncTask。我怎样才能做到这一点?

AsyncTask A代码

@Override
protected Boolean doInBackground(String... arg0) {

    String username = arg0[0];
    String password = arg0[1];

    Boolean v = false;
    ResultSet rs = null;
    Statement stmt = null;


    try {
        DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
        conn = DriverManager.getConnection(jdbcURL, user, passwd);

        try {
            stmt = conn.createStatement();
            try {
                rs = stmt
                        .executeQuery("execute"
                                + username + "'");

                if (rs.next()) {
                    String p=rs.getString("pass_word");
                    if (p==null){
                        if(password.equals(""))
                            v = true;}
                    else
                        if(p.equals(password))
                            v=true;
                }

            } finally {
                try {
                    rs.close();
                } catch (Throwable ignore) {
                }
            }
        } finally {
            try {
                stmt.close();
            } catch (Throwable ignore) {
            }
        }

    } catch (java.sql.SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (java.lang.ClassCastException e) {
        e.printStackTrace();
    }

    return v;

}

AsyncTask B代码

@Override
protected ResultSet doInBackground(String... params) {

    Statement stmt = null;
    ResultSet rs = null;
    try {
        if (conn == null) {
            DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
            conn = DriverManager.getConnection(jdbcURL, user, passwd);
        }

        stmt = conn.createStatement();
        rs = stmt.executeQuery(params[0]);

    } catch (SQLException e) {
        e.printStackTrace();
    }
    return rs;
}

4 个答案:

答案 0 :(得分:0)

在任务A的doInBackground方法中附加任务B中执行的代码。使用onPostExecute方法执行任何后期处理。

答案 1 :(得分:0)

您可以执行onPreExecute()检查登录。 然后doInBackground(Params ...)返回ResultSet

http://developer.android.com/reference/android/os/AsyncTask.html描述更好

答案 2 :(得分:0)

这是一个应该有效的模拟实现:

public class MyTask extends AsyncTask<Params, Void, Integer> {
    private ResultSet result;
    private int option;

    public MyTask(int option) {
        this.option = option;
    }

    @Override
    protected Integer doInBackground(Params... params) {
        switch (option) {
            case checkLogin: {
                // Do checks from first Asynctask here and return an int like normal
            } case getResults: {
                // Get your resultSet here and store:
                this.result = results;
            }
        }
    }

    public ResultSet getResults() {
        if (this.result != null) { 
            return this.result;
        } else {
            // Throw error or log message here
        }
    }
}

另一个解决方案是扩展AsyncTask<Params, Void, Object>然后你可以传递你想要的任何东西,而不是使用另一种方法来获得结果。

答案 3 :(得分:0)

我认为您可以做的最好(假设您的应用程序中还有其他数据库访问案例)将使用您的AsyncTask B(无论如何已经非常通用)作为基类对于所有其他任务,并为特殊情况(例如从中进行登录)扩展任务,并根据需要覆盖onPreExecuteonPostExecute方法。

因此,您可以通过扩展AsyncTask B并将结果集的检查移动到onPostExecute来重写AsyncTask A.或者,如果这太耗时,您可以通过handleResultSetInBackground方法扩展通用AsyncTask B,在获得ResultSet后可以在doInBackground内调用该方法,并且可以在派生中覆盖它类。