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