2013-08-01 9 views
13

tôi có phương thức cập nhật cơ sở dữ liệu SQLite và đặt bên trong AsyncTask này để làm cho nó nhanh hơn và đáng tin cậy hơn.cách chuyển hai loại dữ liệu khác nhau sang AsyncTask, Android

tuy nhiên có hai phần dữ liệu cần thiết để cập nhật cơ sở dữ liệu. một là một số nguyên và một là một đối tượng của lớp PrimaryKeySmallTank được hiển thị ở đây.

sử dụng mảng params trong đối số của phương thức doInBackground của AsyncTask, tôi có thể chuyển số nguyên trong, nhưng nếu tôi có hai loại dữ liệu khác nhau như ở đây thì sao?

nếu một số nguyên được lưu trữ trong int ... params [0] tôi không thể lưu trữ một đối tượng kiểu khác trong tham số [1], vậy điều gì có thể được thực hiện về điều này?

đối tượng tôi muốn vượt qua vào AsyncTask

public class PrimaryKeySmallTank { 

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

} 

các AsyncTask mà tôi đang sử dụng

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

bạn có thể chuyển đối tượng được yêu cầu trong hàm tạo UpdateInfoAsyncTask(). Chỉ cần tạo một hàm tạo cho tác vụ không đồng bộ của bạn –

+0

mã được đặt bên trong phương thức doInBackground có quyền truy cập vào dữ liệu là biến thành viên của lớp UpdateAsyncTask không? như tôi có thể tạo biến thành viên của lớp và chuyển dữ liệu vào hàm tạo cho – Kevik

+0

@Kevik, Có. Tất nhiên bạn có thể. Như bạn thấy trong câu trả lời của tôi, tôi đã viết rằng 'sử dụng intValue' trong phương thức' doInBackground'. Bạn có thể sử dụng các biến thành viên đó và khi bạn cần trong phạm vi lớp đó. :) –

Trả lời

41

Bạn nên tạo một constructor cho điều đó.

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

Để sử dụng nó

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

tôi đã thử trong dự án của mình và nó đang làm việc FANTASTIC – Kevik

+0

Tôi đã đưa ra ví dụ về hai tham số, nhưng bạn có thể vượt qua bao nhiêu tùy thích. Rất vui được trợ giúp :) –

+0

@ChintanRathod cần trợ giúp về ur này http://stackoverflow.com/questions/18054704/how-to-use-scroll-view-in-android – Developer

6

Chỉ vượt qua các đối tượng cần thiết trong các nhà xây dựng nhiệm vụ async của bạn và sau đó sử dụng đối tượng này trong doinBackground(). Bạn có thể tạo constructor và vượt qua các đối tượng của bạn theo cách sau:

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

trong mã của bạn vượt qua các đối tượng yêu cầu:

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

bạn cũng có thể thử một cái gì đó như thế này:

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

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

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

Chỉ cần một nhận xét đơn giản. Theo cách này, cần phải chỉ ra rằng bạn không thể truyền dữ liệu nguyên thủy (vì các nguyên thủy không thể được lưu trữ như một đối tượng). Đối với một dữ liệu nguyên thủy, cách duy nhất là có các trình bao bọc (như Integer, Boolean, vv) được chuyển đổi như bình thường. Ví dụ:

int i = (Integer) objects[0];