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

看了你上面的代码后,

该行Log.i("Data", dbData);应该在onPostExecute()AsyncTask..

实际上,您的代码行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 回答