我想解释一下情况,向您介绍我的问题。我在Android上有AsyncTask
,尝试通过 jdbc 驱动程序连接到数据库。在doInBackground
上,我有以下说明:
conn = DriverManager.getConnection(url, connInfo.getUserName(), connInfo.getPassword());
当我尝试取消AsyncTask
并且任务正在尝试执行上一条指令时出现问题。
我希望用户可以选择取消AsyncTask
并立即再次执行以连接到另一个数据库。当我取消第一个AsyncTask
并开始另一个任务时,直到第一个任务完成连接并完成他的doInBackground
方法,第二个任务无法获得自己的连接。
在这个复杂的解释之后,我认为DriverManager
执行getConnection
是不可能的,而另一个实例正在执行相同的方法。
我想要实现的是:一旦用户取消第一个AsyncTask
,就中止DriverManager.getConnection()
的执行,以便允许第二个任务尽快执行该指令,而不进行用户要等到doInBackground
完成第一项任务。
我复制了部分代码:
class DBConnectionTask extends AsyncTask <ConnectionInfo,Void,Void>{//connection using JDBC driver
private ConnectionInfo connInfo;
private Connection conn;
private Statement st;
private Activity activity;
GlobalData g;
String url;
ProgressDialog loadingCircle;
public DBConnectionTask(Activity activity) {
this.activity = activity;
}
@Override
protected void onPreExecute(){
loadingCircle=ProgressDialog.show(activity,"","Trying to connect, please wait...",false);
loadingCircle.setCancelable(true);
loadingCircle.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
// actually could set running = false; right here, but I'll
// stick to contract.
cancel(true); //cancela asynctask y no hace el onPostExecute
}
});
}
protected Void doInBackground(ConnectionInfo... params) {
connInfo = params[0];
connect();
return null;
}
connect()
方法
protected void connect(){
try
{
//part of the code here is ommited
conn = DriverManager.getConnection(url, connInfo.getUserName(), connInfo.getPassword());
System.out.println("Acaba doInBackGround " + connInfo.getAlias());
//st = conn.createStatement();
Intent intent = new Intent(activity, SqlMenu.class);
activity.startActivity(intent);
}
catch (SQLException e)
{
System.err.println(e);
cancel(true);
}
catch (Exception e)
{
System.err.println(e);
cancel(true);
}
finally {
loadingCircle.dismiss();//loadingCircle.dismiss();
}
}
我想让任务取消,在用户取消任务的那一刻中断它尝试连接数据库。
答案 0 :(得分:0)
您无法中断此DriverManager.getConnection(url, connInfo.getUserName(), connInfo.getPassword());
语句,因为它是预定义方法,您无法对其进行任何控制。但是你可以在预定义方法完成的某些点上中断。
在您编辑的代码中查看以下评论:
protected void connect(){
try
{
//part of the code here is ommited
if(isCancelled())
{
return; // return control if ayncTask is cancelled.
}
conn = DriverManager.getConnection(url, connInfo.getUserName(), connInfo.getPassword());
System.out.println("Acaba doInBackGround " + connInfo.getAlias());
if(isCancelled())
{
return; // return control if ayncTask is cancelled.
}
// query data from database .
// if you are going to use a loop to extract data form cursor, same condition can be used in that loop also.
// so whenever ayncTask is cancelled it can be interrupted.
if(isCancelled())
{
return; // return control if ayncTask is cancelled.
}
Intent intent = new Intent(activity, SqlMenu.class);
activity.startActivity(intent);
}
catch (SQLException e)
{
System.err.println(e);
cancel(true);
}
catch (Exception e)
{
System.err.println(e);
cancel(true);
}
finally {
loadingCircle.dismiss();//loadingCircle.dismiss();
}
}