4

Androidのヘルプページからコードを実行しようとしていますが、うまくいきません:

public class DownloadFilesTask extends AsyncTask<String, Integer, Long> {
        protected Long doInBackground(String... urls) {
            Log.e("TuneWiki", "Exec");
            return 1l;
        }

        @Override
        protected void onPostExecute(Long result) {
            Log.e("TuneWiki", "Post");
        }
}

タスクを実行すると、doInBackground は正常に呼び出されますが、onPostExecute は呼び出されません:(

Milestone 2.1 OS でテスト済み

4

2 に答える 2

6

みんなありがとう - 理由がわかりました。AsyncTask は、すべてのスレッドが正常に完了した場合でも、以前に多くのスレッドが開始されていた場合、何らかの理由で動作を停止します。

于 2010-07-30T05:33:08.317 に答える
1

ファイルのダウンロードに AsyncTasks を使用することはお勧めできません (AsyncTask の名前が示すように)。AsyncTasks は、ネットワークなどの長時間実行される操作には使用しないでください。実際、AsyncTask には関連する 2 つの主な問題があります。

  • アクティビティのライフ サイクルとの関連性が低い
  • create メモリ リークは非常に簡単です。

RoboSpice Motivations アプリ ( Google Play で入手可能)内で、その質問に詳しく答えます。AsyncTasks、ローダー、それらの機能と欠点の詳細なビューを提供し、ネットワーク リクエストの代替ソリューションである RoboSpice も紹介します。

この問題を説明するインフォグラフィックも提供しました。一言で言えば

  • AsyncTask には、Activity Lifecycle との関連付けが不十分であり、メモリ リークが発生するため、欠陥があります。
  • ローダーは、Sqlite データベースのカーソルにアクセスするために設計された目的には非常に優れていますが、ネットワークのサポートは提供していません。彼らはこれには間違ったツールです。
  • RoboSpice はネットワーク リクエストをサービスで実行し、ダウンロードは Android サービスで実行します。メモリは適切に管理され、REST リクエストの作成もサポートします。

RoboSpice Motivations アプリをダウンロードすることをお勧めします。これは、これについて詳しく説明し、いくつかのバックグラウンド操作を実行するさまざまな方法のサンプルとデモを提供します。

于 2012-10-26T06:57:58.867 に答える