0

I have the following scenario: in my application I am using AsyncTask A to connect to the database and check the login. This AsyncTask's doInBackground method returns a boolean value. For some user interaction I am using AsyncTask B to connect to the same database and get back a ResultSet. Everything is working fine, but I want to use only one AsyncTask. How can I do this?

AsyncTask A code

@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 code

@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

4 回答 4

0

我认为你能做的最好的事情(假设你的应用程序中会有更多的数据库访问案例)是使用你的 AsyncTask B (无论如何它已经很通用)作为所有其他任务的基类,并为特殊任务扩展任务像从它登录这样的情况,只需根据需要覆盖onPreExecuteandonPostExecute方法。

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

于 2013-03-27T10:00:28.563 回答
0

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

于 2013-03-27T09:55:59.177 回答
0

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

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

于 2013-03-27T09:56:04.520 回答
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>,然后你可以传递你想要的任何东西,而不是使用另一种方法来获得结果。

于 2013-03-27T09:56:59.600 回答