2015-01-31 1 views
0

У меня проблема при использовании AsyncTask, этот код работает нормально, но когда я возвращаю ResultSet, в mainActivity у меня нет результата AsyncTask и моего приложения. Я пытаюсь использовать таймер и Thread.sleep и не работаюAsyncTask and ResultSet on android

 blast_dbConnect task = new blast_dbConnect("asd","123",MainActivity.this); 
    task.execute("Conectando",sql); 
try { 
     if(rs.next()==true && rs!=null){ 

      String passCheck; 
      passCheck = rs.getString("password"); 
      Log.i("Se conecta",passCheck); 
      tv3.setText(passCheck); 


     /*catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     */ 
     /*if(passCheck.equals(password)){ 
      Log.i("Se conecta","Se conecta"); 
      return rs; 
     }*/ 

     } 
    } catch (SQLException e) { 
      // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

Это мой synctask код RS является ResultSet (я хочу, чтобы мой synctask возвратить набор. Моя synctask это

 public class blast_dbConnect extends AsyncTask<String,String,ResultSet> { 
String username; 
String password; 
Context c; 
ProgressDialog pd; 
private String ipServidorMySQL = "jdbc:mysql://db4free.net:3306/cuetospalace"; 
private String contrasenaMySQL="636251630"; 
private String usuarioMySQL = "sdelcueto"; 


public blast_dbConnect(String user,String pass,Context context){ 
    username = user; 
    password = pass; 
    c = context; 
} 
@Override 
protected void onPreExecute(){ 
    pd = new ProgressDialog(c); 
    pd.setMessage("Conectando"); 
    pd.setCancelable(false); 
    pd.show(); 

} 
@Override 
protected ResultSet doInBackground(String...params) { 
    boolean login = false; 
    String input = params[1]; 
    //publishProgress(input); 
    try{ 
     try { 
      Thread.sleep(3000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     Connection conn; 
     Class.forName("com.mysql.jdbc.Driver").newInstance(); 
     //conn = DriverManager.getConnection("jdbc:mysql://db4free.net:3306/cuetospalace","sdelcueto","636251630"); 
     conn = (Connection)DriverManager.getConnection(ipServidorMySQL, usuarioMySQL, contrasenaMySQL); 
     //Log.i("SQL",input); 

     Statement stmt = conn.createStatement(); 
     //Log.i("Se conecta","Se conecta"); 
     ResultSet rs = stmt.executeQuery(input); 
     /*if(rs.next()==true){ 


      String passCheck = rs.getString("password"); 

      return passCheck; 
      /*if(passCheck.equals(password)){ 
       Log.i("Se conecta","Se conecta"); 
       return rs; 
      }*/ 

     //} 
     return rs; 

    } 
    catch(SQLException | InstantiationException | IllegalAccessException | ClassNotFoundException e){ 
     //Log.i("bla",e.getMessage()); 
     return null; 
    } 

} 
@Override 
protected void onProgressUpdate(String...params){ 
    //Log.i("onProgressUpdate","onProgressUpdate"); 
    pd.setMessage(params[0]); 
} 

protected void onPostExecute(ResultSet rs){ 

    //Log.i("onPostExecute","onPostExecute"); 
    MainActivity.rs=rs; 
    if(pd != null) 
     pd.dismiss(); 
    //pd.cancel(); 


} 
protected void onCancelled(){ 
    //Log.i("onCancelled","onCancelled"); 
    cancel(true); 
} 

} Я хочу, чтобы он основной поток должен ожидать конца AsyncTask, я пытаюсь функция прибудете слишком Может кто-нибудь мне помочь?

ответ

0

если вы хотите основной поток должен ожидать AsyncTask, так почему бы не сделать свою работу в основная тема?

, если вы хотите, что вы можете запустить ProgressDialog с cancelable= false в onPreExecute(), а затем в onPostExecute() dismis этот диалог.

class MyAsync extends AsyncTask<String, Void, String> { 

    ProgressDialog progressDialog; 

    @Override 
    protected void onPreExecute() { 
     // TODO Auto-generated method stub 
     super.onPreExecute(); 
     progressDialog = new ProgressDialog(Activity.this); 
     progressDialog.setMessage("please wait..."); 

     progressDialog.setCancelable(false); 
     progressDialog.show(); 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     //background task 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     if(progressDialog != null) 
      progressDialog.dismiss(); 

    } 

} 

UPDATE:
в коде:

public void onCreate(Bundle savedInstanceState){  
    blast_dbConnect task = new  blast_dbConnect("asd","123",MainActivity.this); 
    task.execute("Conectando",sql); 
} 

public void useRS(ResultSet rs){ 
    this.rs = rs; 
    try { 
     if(rs!=null && rs.next()==true){ 

      String passCheck; 
      passCheck = rs.getString("password"); 
      Log.i("Se conecta",passCheck); 
      tv3.setText(passCheck); 


     /*catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     */ 
     /*if(passCheck.equals(password)){ 
      Log.i("Se conecta","Se conecta"); 
      return rs; 
     }*/ 

     } 
    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

в onPostExecute():

onPostExecute(ResultSet rs){ 
    if(pd!=null) 
     pd.dismis(); 
    useRS(rs); 
} 
+0

Он выходит из строя, в случае (rs.next() == TRUE && RS! = null), этот код строки в моем основном потоке, является nullPointerException – sdelcueto

+0

@sdelcueto, что такое rs? можете ли вы поместить свой полный код? – MHP

+0

Я редактирую свой пост, вы можете видеть мой код там. Rs - resultSet, я хочу, чтобы моя synctask вернула результат – sdelcueto