0

私は AsyncTask を読みました。ほとんどのことはわかりましたが、まだ少し質問があります。

私は基本的に、スレッドを使用してオンライン ソースからデータを取得し、それをアクティビティに返したいと考えています。以下は簡単な疑似コードです。

public class register extends Activity implements OnClickListener{

public static String dbData;

     public static void setDBData(String data)
     {
         dbData = data;
     }

   //CALLED FROM ONCREATE()
 public void regPageTwo()
 {
     setContentView(R.layout.layout_register_two);
     new dataExchange().execute(1);
        Log.i("Data", dbData);

 }

}

public class dataExchange extends AsyncTask<Integer, Void, String>{

       @Override
    protected String doInBackground(Integer... params) {
      //EVENTUALLY DO OTHER COMPUTATION
        String test="aTest";
        return test;
    }

    @Override
    protected void onPostExecute(String result)
    {
        register.setDBData(result);
    }
}

(まだこれを使用するのに慣れていないため、書式設定が不十分で申し訳ありません)。dbData が常に NULL である理由は何ですか?

前もって感謝します

4

2 に答える 2

1
 public void regPageTwo()
 {
    setContentView(R.layout.layout_register_two);
    new dataExchange().execute(1);
    Log.i("Data", dbData);
 }

上記のコードを見た後、

行はAsyncTaskのLog.i("Data", dbData);中にある必要があります。onPostExecute()

実際、コード行Log.i("Data", dbData);はAsyncTaskが完了する直前に実行されます。したがって、常にNULLになります。完全なAsyncTaskを待つ必要があります。または私が提案したように、この行をに入れてonPostExecute()ください。

于 2013-02-14T12:59:50.040 に答える
1

この行が実行されるため:

Log.i("Data", dbData);

直後

new dataExchange().execute(1);

ただし、この行は将来のある時点で実行されます。

register.setDBData(result);

これは、別のスレッドで非同期に実行されるために発生します。

于 2013-02-14T12:59:59.413 に答える