2013-08-01 12 views
13

ho un metodo che fa aggiornare un database SQLite e lo metto dentro un AsyncTask per renderlo più veloce e più affidabile.come passare in due diversi tipi di dati ad AsyncTask, Android

tuttavia ci sono due pezzi di dati necessari per aggiornare il database. uno è un numero intero e l'altro è un oggetto della classe PrimaryKeySmallTank mostrata qui.

utilizzando la matrice params negli argomenti del metodo doInBackground di AsyncTask, posso passare un intero in, ma cosa succede se ho due diversi tipi di dati come qui?

se un numero intero è memorizzato in parametri ... [0] non posso memorizzare un oggetto di tipo diverso in param [1], quindi cosa si può fare al riguardo?

oggetto voglio passare nel AsyncTask

public class PrimaryKeySmallTank { 

int contractNumber; 
int customerCode; 
int septicCode; 
String workDate; 
int workNumber; 

} 

l'AsyncTask che sto usando

public class UpdateInfoAsyncTask extends AsyncTask<Integer, Void, Void>{ 

    @Override 
    protected void onPreExecute() { 
    // TODO Auto-generated method stub 

    } 

    @Override 
    protected Void doInBackground(Integer... params) { 
     Integer mIntegerIn = params[0]; // this is what I want to do, example 
     PrimaryKeySmallTank mPrimaryKeySmallTank = params[1]; // different data type to pass in 

     Database db = new Database(InspectionInfoSelectionList.this); 
     db.openToWrite(); 
     db.updateWorkClassificationByRow(mPrimaryKeySmallTank, mIntegerIn); 
     db.close(); 

      return null; 
    } 

} // end UpdateInfoAsyncTask 
+0

è possibile passare l'oggetto richiesto nel costruttore UpdateInfoAsyncTask(). Basta creare un costruttore per la tua attività asincrona –

+0

il codice inserito nel metodo doInBackground ha accesso ai dati che sono una variabile membro della classe UpdateAsyncTask? come posso creare variabili membro della classe e passare dati nel costruttore per quello – Kevik

+0

@Kevik, Sì. Certo che puoi. Come puoi vedere nella mia risposta, ho scritto che 'usa intValue' nel metodo' doInBackground'. È possibile utilizzare tali variabili membro come e quando necessario nell'ambito di questa classe. :) –

risposta

41

Si dovrebbe creare un costruttore per questo.

public class UpdateInfoAsyncTask extends AsyncTask<Void, Void, Void>{ 
    int intValue; 
    String strValue; 

    public UpdateInfoAsyncTask(int intValue,String strValue){ 
     this.intValue = intValue; 
     this.strValue = strValue; 
    } 

    @Override 
    protected void onPreExecute() { 
    // TODO Auto-generated method stub 

    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     //use intValue 
     //use strValue 
     return null; 
    } 
} 

di usarlo

new UpdateInfoAsyncTask(10,"hi").execute(); 
+2

ho provato questo nel mio progetto e funziona FANTASTICO – Kevik

+0

Ho dato un esempio di due parametri, ma puoi passare quanti ne vuoi. Felice di aiutare :) –

+0

@ChintanRathod in bisogno di aiuto su questo http://stackoverflow.com/questions/18054704/how-to-use-scroll-view-in-android – Developer

6

Proprio passare l'oggetto desiderato nel costruttore del vostro compito async e poi utilizzare questo oggetto in doinBackground(). È possibile creare costruttore e passare il vostro oggetto nel seguente modo:

public class MyAsyncTask extends AsyncTask<Void, Void, Void>{ 

    PrimaryKeySmallTank tankObj; 

    public UpdateInfoAsyncTask(PrimaryKeySmallTank obj){ 
     tankObj=obj; 
    } 

    @Override 
    protected void onPreExecute() { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     //code and use tankObj 
     return null; 
    } 
} 

nel codice passare l'oggetto desiderato:

new myAsyncTask(new PrimaryKeySmallTank (1,1,1,"hi",1).execute(); 
4

si può anche provare qualcosa di simile:

private class xyz extends AsyncTask<Object, Void, String> { 

@Override 
protected String doInBackground(Object... objects) { 

Long abc = (Long)objects[0]; 
String pqr = (String)objects[1]; 
. 
. 
. 

Basta una semplice osservazione. In questo modo, si dovrebbe sottolineare che non è possibile passare i dati primitivi (poiché i primitivi non possono essere memorizzati come oggetti). Per i dati primitivi l'unico modo è quello di convertire i wrapper (come Integer, Boolean ecc.) Come al solito. Ad esempio,

int i = (Integer) objects[0]; 
Problemi correlati