我有以下场景:在我的应用程序中,我使用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;
}
答案 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(无论如何已经非常通用)作为基类对于所有其他任务,并为特殊情况(例如从中进行登录)扩展任务,并根据需要覆盖onPreExecute
和onPostExecute
方法。
因此,您可以通过扩展AsyncTask B并将结果集的检查移动到onPostExecute来重写AsyncTask A.或者,如果这太耗时,您可以通过handleResultSetInBackground
方法扩展通用AsyncTask B,在获得ResultSet后可以在doInBackground
内调用该方法,并且可以在派生中覆盖它类。