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();

synchronouslyただし、ファイルをアップロードするときは、スレッドの実行中にAsyncTask がasynchronously(並行して) 実行されます。
どうしてですか?AsyncTask がこのように動作するのはなぜですか? AsyncTask は非同期で実行されるはずではありませんか?
私は少し混乱しているので、あなたの助けが必要です。
GetDataTask を呼び出す方法は次のとおりです。

new GetDataTask().execute()

私は AsyncTask を使用することを好みますが、それは私のために仕事をしていません。詳細については、私の初期の質問を参照してください

4

4 に答える 4

11

4.x の時点で、2 つの AsyncTasks を呼び出すと、それらが連続して実行されます。

これを修正する 1 つの方法は、次のコードを使用することです。

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ドキュメントからのメモです...

実行順序

最初に導入されたとき、AsyncTasks は単一のバックグラウンド スレッドでシリアルに実行されました。DONUT以降、これはスレッドのプールに変更され、複数のタスクが並行して動作できるようになりました。HONEYCOMB 以降、並列実行によって発生する一般的なアプリケーション エラーを回避するために、タスクは単一のスレッドで実行されます。

If you truly want parallel execution, you can invoke 

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

SO 2 つの AsyncTask を一緒に呼び出すと、それらは並行して実行されません (ドーナツ、encliar、ジンジャーブレッドは例外です) ... でそれらを実行するために使用できますexecuteOnExecutorparallel

于 2013-03-18T07:46:29.197 に答える
2

コードから、アプリケーションのMainUIThreadで実行されるparseJson(result);AsyncTaskを呼び出したことがわかります。したがって、その時点でコードは同期的に実行されます。onPostExecute()

他のワーカースレッドでのみ実行されるPutparseJson(result);メソッド。doInBackGround()

あなたがで同じことを呼んでいる間Thread。だから両方

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

非同期で経験したMAinUiThreadから他のワーカースレッドで実行されます。

ノート:

ただし、 UIが表示されている間はUIをparseJson(res); 更新しないdoInBackground(ようにしてください)。

于 2013-03-18T07:43:02.897 に答える
0

実際の問題はファイルのアップロードではなく、parseJsonメソッドにあるようです。

あなたのThread例ではAsyncTask、UI スレッドで Json を解析する場合に備えて、別のスレッドで Json を解析します。

于 2013-03-18T07:46:29.650 に答える