15

SQLite データベースの更新を行うメソッドがあり、これを AsyncTask 内に配置して、より高速で信頼性の高いものにします。

ただし、データベースを更新するために必要なデータが 2 つあります。1 つは整数で、もう 1 つはここに示されている PrimaryKeySmallTank クラスのオブジェクトです。

AsyncTask の doInBackground メソッドの引数に params 配列を使用すると、Integer を渡すことができますが、このように 2 つの異なる型のデータがある場合はどうなるでしょうか。

整数が int に格納されている場合... params[0] params[1] に別の型のオブジェクトを格納することはできません。

AsyncTask に渡したいオブジェクト

public class PrimaryKeySmallTank {

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

}

私が使用しているAsyncTask

 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
4

3 に答える 3

44

そのためのコンストラクターを作成する必要があります。

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

使用するには

new UpdateInfoAsyncTask(10,"hi").execute();
于 2013-08-01T09:20:59.677 に答える
6

必要なオブジェクトを非同期タスクのコンストラクターに渡し、後でこのオブジェクトをdoinBackground () で使用するだけです。コンストラクターを作成し、次の方法でオブジェクトを渡すことができます。

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

コードで、必要なオブジェクトを渡します。

new myAsyncTask(new PrimaryKeySmallTank (1,1,1,"hi",1).execute();
于 2013-08-01T09:26:58.473 に答える
4

次のようなものを試すこともできます:

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

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

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

簡単な指摘です。このように、プリミティブ データを渡すことができないことを指摘する必要があります (プリミティブをオブジェクトとして格納できないため)。プリミティブ データの場合、唯一の方法はラッパー (整数、ブール値など) を通常どおりに変換することです。例えば、

int i = (Integer) objects[0];
于 2014-03-30T08:18:47.713 に答える