0

次のシナリオがあります。私のアプリケーションでは、AsyncTask Aを使用してデータベースに接続し、ログインを確認しています。このAsyncTaskのdoInBackgroundメソッドは、ブール値を返します。一部のユーザーインタラクションでは、AsyncTask Bを使用して同じデータベースに接続し、ResultSetを取得しています。すべて正常に動作していますが、AsyncTaskを1つだけ使用したいと思います。これどうやってするの?

AsyncTaskコード

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

}

AsyncTaskBコード

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

4 に答える 4

0

doInBackgroundタスクAのメソッドのタスクBで実行されたコードを追加します。このメソッドを使用してonPostExecute、後処理を実行します。

于 2013-03-27T09:55:59.177 に答える
0

onPreExecute()でログインをチェックできます。次に、doInBackground(Params ...)を実行してResultSetを取得します

http://developer.android.com/reference/android/os/AsyncTask.htmlは、より適切に説明しています

于 2013-03-27T09:56:04.520 に答える
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>して、別の方法を使用して結果を取得する代わりに、必要なものを渡すことができるようにすることです。

于 2013-03-27T09:56:59.600 に答える
0

あなたができる最善のことは(アプリでデータベースアクセスのさらなるケースがあると仮定して)、他のすべてのタスクの基本クラスとしてAsyncTask B(とにかくすでにかなり一般的です)を使用し、特別なタスクを拡張することだと思いますそれからのログインのような場合は、必要に応じてメソッドonPreExecuteとメソッドをオーバーライドするだけonPostExecuteです。

したがって、AsyncTask Bを拡張して、結果セットのチェックをonPostExecuteに移動することにより、AsyncTaskAを書き直すことができます。または、これに時間がかかりすぎる場合は、ResultSetを取得した後に呼び出し、派生クラスでオーバーライドできるhandleResultSetInBackgroundメソッドを使用して、汎用AsyncTaskBを拡張できます。doInBackground

于 2013-03-27T10:00:28.563 に答える