【问题标题】:AsyncTask Workflow异步任务工作流
【发布时间】:2013-09-23 21:10:32
【问题描述】:

我目前正在开发一个必须使用多个 AsyncTask 处理网络连接的 Android 应用程序。

这是建立连接并调用处理麦克风输入的新任务的第一个任务。

private class establishConnectionTask extends
        AsyncTask<String, Integer, String> {

    @Override
    protected String doInBackground(String... params) {
        try {
            // initialize connection
            initConnection();
            MicrophoneTask micTask = new MicrophoneTask();
            micTask.execute("");
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "Executed";
    }

    @Override
    protected void onPostExecute(String result) {
        mReadInputTask = new readInputTask();
        mReadInputTask.execute("");
        super.onPostExecute(result);
    }

一切正常,连接正常,我可以传输数据。 MicrophoneTask 也在做它的工作。

问题来了:

onPostExecute 方法中,我正在创建一个新的 AsyncTask,它应该处理所有网络输入。

这是 readInputTask 的样子:

private class readInputTask extends AsyncTask<String, Integer, String>
{

    @Override
    protected void onPreExecute()
    {
        Log.d("DEBUG", "pre");
        super.onPreExecute();

    }

    @Override
    protected String doInBackground(String... params) {
        // blocking readInput method
          Log.d("DEBUG", "doInBackground");
    }


    @Override
    protected void onPostExecute(String result) {
        Log.d("DEBUG", "post");
        super.onPostExecute(result);
    }
}

readInputTask 不知何故卡在 readInputTask 的 onPreExecute 方法中。我得到的唯一输出是“pre”,尽管我也期望“doInBackground”和“post”。

有人看到错误或知道解决方案吗?

感谢任何帮助!

【问题讨论】:

  • 我认为doInBackground 在 Log 行之前抛出异常。您在 Logcat 中看到任何错误吗?
  • 不抛出异常。我只看到我的日志行。

标签: android multithreading android-asynctask network-programming


【解决方案1】:
mReadInputTask.execute("");

当您使用AsyncTask#execute(params) 时,AsyncTask 会依次执行:一个接一个。要并行执行 AsyncTasks,请使用 AsyncTask#executeOnExecutor(...)

来自executeOnExecutor (Executor exec, Params... params)上的文档:

此方法通常与 THREAD_POOL_EXECUTOR 一起使用以允许 多个任务在由管理的线程池上并行运行 AsyncTask,但是您也可以使用自己的 Executor 进行自定义 行为。

【讨论】:

  • 非常感谢,现在可以使用了!我认为 AsyncTasks 是并行的。
  • @Al0x 是的,他们曾经是。从版本 1.6 (Donut) 到 3.0 (Honeycomb),AsyncTask 默认并行执行(使用 ThreadPool)。但是,[s]tarting with HONEYCOMB, tasks are executed on a single thread to avoid common application errors caused by parallel execution(取自AsyncTask(subheading: Order of execution))。
猜你喜欢
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多