当我关闭并开始活动时,为什么我的活动中的线程以同步方式执行?

时间:2014-06-05 15:15:45

标签: android multithreading android-asynctask androidhttpclient

我的方案如下: 我有一个活动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之后 即使我很快重新启动活动也完成了。 enter image description here

1 个答案:

答案 0 :(得分:2)

从3.0开始,AsyncTasks都在一个线程上运行循环,因为谷​​歌认为应用程序开发人员编写并发代码太愚蠢了。实际上,这个网站上的问题让我觉得他们可能是对的。您可以通过使用AsyncTask.executeOnExecutor()而不是在启动任务时执行来覆盖该行为。