当Service在后台工作时,AsyncTask中的doInBackground从不调用

时间:2012-12-02 14:13:16

标签: java android android-asynctask android-service

private class Test extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
            Log.d("test", "called1");
        }

        @Override
        protected Void doInBackground(Void... params) {
            Log.d("test", "called2");
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            Log.d("test", "called3");
        }
    }

并输出:

试验:called1

为什么其他方法永远不会在Service在后台运行时调用?如果服务停止,那么所有方法调用和输出:

试验:called1

试验:called2

试验:called3

1 个答案:

答案 0 :(得分:8)

我猜你正在测试android 3.x或更新版本,你只是受到AsyncTask执行方式改变的影响。

这就是我在代码中处理这个问题的方法,以便始终完全并行地运行:

if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ) {
    new Test().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
    new Test().execute();
}

AscombTask的基本更改出现在Honeycomb中(请参阅“执行顺序”部分中的Android SDK文档here),因此在此之前,您可以照常启动它,对于HC和up,请使用executeOnExecutor()如果你不喜欢新的行为(没想到,我认为)