如何在运行DriverManager.getConnection时停止AsyncTask?

时间:2015-07-15 18:41:30

标签: android android-asynctask

我想解释一下情况,向您介绍我的问题。我在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();
        }
    }

我想让任务取消,在用户取消任务的那一刻中断它尝试连接数据库。

1 个答案:

答案 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();
        }
    }