6

如果我没记错的话,以下内容应该是相同的。
使用AsyncTask

private class GetDataTask extends AsyncTask<String, Void, String>{

    @Override
    protected void onPreExecute() {

    }

    @Override
    protected String doInBackground(String... params) {
        return NetConnection.getRecordData(mUserId, mUserPassword);
    }

    @Override
    protected void onPostExecute(String result) {
        parseJson(result);
    }
}

使用线程

    new Thread( new Runnable() {

        @Override
        public void run() {
            String res = NetConnection. getRecordData(mUserId, mUserPassword);
            parseJson(res);

        }
    }).start();

但是在上传文件时,AsyncTasksynchronously在 Thread 运行时运行asynchronously(并行)。
为什么会这样?为什么 AsyncTask 会这样?AsyncTask 不应该异步运行吗?
我有点困惑,所以我需要你的帮助。
这就是我调用 GetDataTask 的方式:

new GetDataTask().execute()

我更喜欢使用 AsyncTask,但它并没有为我完成这项工作。请参阅我的早期问题以获取更多详细信息

4

4 回答 4

11

从 4.x 开始,调用 2 个 AsyncTask 将导致它们被串行执行。

解决此问题的一种方法是使用以下代码

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

您可以在以下位置阅读更多信息:http ://commonsware.com/blog/2012/04/20/asynctask-threading-regression-confirmed.html

于 2013-03-18T07:56:01.613 回答
3

好的,以下是官方 java 文档中的注释...

执行顺序

首次引入时,AsyncTask 在单个后台线程上串行执行。从DONUT开始,这被更改为允许多个任务并行运行的线程池。从 HONEYCOMB开始,任务在单个线程上执行,以避免并行执行导致的常见应用程序错误。

If you truly want parallel execution, you can invoke 

executeOnExecutor(java.util.concurrent.Executor, Object[])THREAD_POOL_EXECUTOR

所以如果你一起调用两个 AsyncTask ......它们不会被并行执行(例外是甜甜圈、encliar 和姜饼)......你可以使用executeOnExecutor它们来执行它们parallel......

于 2013-03-18T07:46:29.197 回答
2

从您的代码中,我们可以看到您调用parseJson(result);了在应用程序的MainUIThreadonPostExecute()中运行的 AsyncTask 。因此,此时您的代码会同步运行..

仅在其他工作线程中运行的PutparseJson(result);方法。doInBackGround()

虽然你在Thread. 所以两者

String res = NetConnection. getRecordData(mUserId, mUserPassword);
parseJson(res);

在您异步体验的MAinUiThread 之外的其他工作线程中运行。

笔记:

但请确保您parseJson(res); 不会在 UI 中更新 UIdoInBackground(

于 2013-03-18T07:43:02.897 回答
0

看起来实际问题不在于文件上传,而在于parseJson方法。

在您的Thread示例中,您在单独的线程中解析 Json,而AsyncTask如果您在 UI 线程中解析 Json。

于 2013-03-18T07:46:29.650 回答