我已经阅读过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?
提前致谢
答案 0 :(得分:1)
public void regPageTwo()
{
setContentView(R.layout.layout_register_two);
new dataExchange().execute(1);
Log.i("Data", dbData);
}
查看上面的代码后,
行Log.i("Data", dbData);
应位于AsyncTask的onPostExecute()
..
实际上,您的代码行Log.i("Data", dbData);
会在完成AsyncTask之前立即执行。所以它总是 NULL 你必须等待完整的AsyncTask。或者我建议将此行放在onPostExecute()
。
答案 1 :(得分:1)
因为这一行将被执行:
Log.i("Data", dbData);
后立即
new dataExchange().execute(1);
但是这条线将在未来的某个时间执行:
register.setDBData(result);
会发生这种情况,因为它在另一个主题上运行 asynchronously 。