我的方案如下:
我有一个活动A,
我在其中使用带有AsyncTask
请求的线程t1开始HttpGet
,并且超时为3秒,
在t1超时之后,我以HttpGet
请求开始t2,超时30秒。
现在我开始活动A,我故意用我的代理fiddler抛出HttpPost
请求,在t1超时但是t2正在运行之后,我停止并快速重启活动。
一个奇怪的事情发生了,新的t1等到老t2超时。
任何人都可以解释为什么在Android中发生这种事情,为什么t1在重新启动活动A后没有立即启动,如何在活动重启后立即启动t1?
我的测试代码是
private class MyAsyncTask extends AsyncTask<String, Integer, String> {
@Override
protected String doInBackground(String... params) {
httpget("http://www.baidu.com",3000);
httpget("http://www.baidu.com",30000);
return "test";
}
protected void onCancelled() {
super.onCancelled();
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new MyAsyncTask().execute("start");
}
日志结果如下所示,第二个“httpget start timeout is 3000”出现在t2之后 即使我很快重新启动活动也完成了。
答案 0 :(得分:2)
从3.0开始,AsyncTasks都在一个线程上运行循环,因为谷歌认为应用程序开发人员编写并发代码太愚蠢了。实际上,这个网站上的问题让我觉得他们可能是对的。您可以通过使用AsyncTask.executeOnExecutor()而不是在启动任务时执行来覆盖该行为。