2013-08-01 18 views
13

Mam metodę, która aktualizuje bazę danych SQLite i umieszczam ją w AsyncTask, aby była szybsza i bardziej niezawodna.jak przekazywać dwa różne typy danych do AsyncTask, Android

Istnieją jednak dwie części danych, które są potrzebne do aktualizacji bazy danych. jeden to Integer, a drugi to obiekt klasy PrimaryKeySmallTank, który jest tutaj pokazany.

przy użyciu macierzy params w argumentach metody doInBackground AsyncTask, mogę podać Integer, ale co jeśli mam dwa różne typy danych, jak tutaj?

jeśli liczba całkowita jest zapisana w int ... params [0] nie mogę zapisać innego obiektu typu w parametrach [1], więc co można z tym zrobić?

obiekt chcę przejść do AsyncTask

public class PrimaryKeySmallTank { 

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

} 

się AsyncTask że używam

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

można przekazać wymagany obiekt w konstruktorze UpdateInfoAsyncTask(). Po prostu utwórz konstruktora dla swojego zadania asynchronicznego –

+0

Czy kod umieszczony wewnątrz metody doInBackground ma dostęp do danych, które są zmiennymi składowymi klasy UpdateAsyncTask? jak mogę utworzyć zmienne członkowskie klasy i przekazać dane do konstruktora dla tego – Kevik

+0

@Kevik, Tak. Oczywiście, że możesz. Jak widać w mojej odpowiedzi, napisałem, że 'use intValue' w metodzie' doInBackground'. Możesz użyć tych zmiennych składowych, gdy są potrzebne w ramach tego zakresu klasy. :) –

Odpowiedz

41

Należy utworzyć konstruktor tego.

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

go używać

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

próbowałem tego w moim projekcie i działa FANTASTIC – Kevik

+0

Podałem przykład dwóch parametrów, ale możesz przekazać tyle, ile chcesz. Cieszę się, że mogę pomóc :) –

+0

@ChintanRathod w potrzebie ur pomoc na ten http://stackoverflow.com/questions/18054704/how-to-use-scroll-view-in-android – Developer

6

Wystarczy przechodzą żądany obiekt w konstruktorze swojego zadania asynchronicznym a później korzystać z tego obiektu w doinBackground(). Można utworzyć konstruktor i przekazać swój obiekt w następujący sposób:

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

w kodzie przechodzą żądany obiekt:

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

można również spróbować czegoś takiego:

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

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

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

tylko prosty uwagę. W ten sposób należy podkreślić, że nie można przekazać danych pierwotnych (ponieważ prymitywy nie mogą być przechowywane jako obiekt). W przypadku prymitywnych danych jedynym sposobem jest przekształcenie wrapperów (takich jak Integer, Boolean itp.) W zwykły sposób. Na przykład:

int i = (Integer) objects[0]; 
Powiązane problemy