2013-03-27 35 views
0

我有以下情形:在我的應用程序中,我使用AsyncTask A連接到數據庫並檢查登錄。這個AsyncTask的doInBackground方法返回一個布爾值。 對於某些用戶交互,我使用AsyncTask B連接到相同的數據庫並獲取ResultSet。 一切工作正常,但我只想使用一個AsyncTask。我怎樣才能做到這一點?使用一個AsyncTask而不是兩個AsyncTasks在android

的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

你可以包含一些代碼嗎? – Cornholio 2013-03-27 09:40:48

+0

如果登錄存在,你會執行什麼樣的動作? – Sajmon 2013-03-27 09:42:03

+0

@Cornholio添加了一些代碼 – 2013-03-27 09:46:04

回答

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>,然後你可以通過任何你想要的,而不是使用另一種方法來獲得結果。

0

追加這是在任務B中任務A的doInBackground方法中執行的代碼。使用onPostExecute方法執行任何後期處理。

0

我覺得你可以做(​​假設會出現在你的應用程序的數據庫訪問進一步例)將使用您的AsyncTask B(這已經是相當通用反正)爲基類對所有其他的最佳任務和擴展特殊情況下的任務,如登錄它,只是根據需要覆蓋onPreExecuteonPostExecute方法。

因此,您可以通過擴展AsyncTask B並將結果集的檢查移動到onPostExecute來重寫AsyncTask A.或者,如果這太費時,則可以通過handleResultSetInBackground方法擴展泛型AsyncTask B,在獲得ResultSet之後,您可以在doInBackground之內調用該方法,並且可以在派生類中重寫該方法。

相關問題