在android中使用一个异步任务而不是两个异步任务

在android中使用一个异步任务而不是两个异步任务,android,android-asynctask,Android,Android Asynctask,我有以下场景:在我的应用程序中,我使用AsyncTaskA连接到数据库并检查登录。此AsyncTask的doInBackground方法返回一个布尔值。 对于某些用户交互,我使用AsyncTask B连接到同一个数据库并返回一个结果集。 一切正常,但我只想使用一个异步任务。我该怎么做 异步任务代码 @Override protected Boolean doInBackground(String... arg0) { String username = arg0[0]; Str

我有以下场景:在我的应用程序中,我使用AsyncTaskA连接到数据库并检查登录。此AsyncTask的doInBackground方法返回一个布尔值。 对于某些用户交互,我使用AsyncTask B连接到同一个数据库并返回一个结果集。 一切正常,但我只想使用一个异步任务。我该怎么做

异步任务代码

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

}
异步任务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;
}

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

您可以执行onPreExecute()检查登录。 然后执行background(Params…)以获取结果集


描述更好的

这里是一个应该可以工作的模拟实现:

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
        }
    }
}
公共类MyTask扩展了AsyncTask{
私有结果集结果;
私人int期权;
公共MyTask(int选项){
this.option=选项;
}
@凌驾
受保护的整数doInBackground(Params…Params){
开关(选件){
案例检查登录:{
//从这里的第一个Asynctask执行检查,并返回一个与normal类似的int
}案例结果:{
//在此处获取结果集并存储:
this.result=结果;
}
}
}
公共结果集getResults(){
如果(this.result!=null){
返回此结果;
}否则{
//在此处抛出错误或日志消息
}
}
}

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

我认为你能做的最好的事情(假设你的应用程序中会有更多的数据库访问案例)是使用你的AsyncTask B(它已经非常通用了)作为所有其他任务的基类,并为特殊情况(如登录)扩展任务,只需根据需要重写
onPreExecute
onPostExecute
方法


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

是否可以包含一些代码?如果存在登录,“你会采取什么样的行动?”康霍利奥补充道code@Sajmon我正在启动一个新的Activitycreate类扩展ASYNCTASK..并重写其所有方法..pre、do和post。