2

アプリが開いているときに、サービスを使用してビュー内のテキストビューを継続的に更新する Android アプリがあります。インテントを送信するブロードキャストレシーバーを使用して更新します。アプリの性質上、アプリが終了した後やビューがなくなった後もサービスを実行し続ける必要があります。この場合、メイン スレッドでサービスを実行するのは明らかに賢明ではありません。では、このサービスを実行し続ける最善の方法は何でしょうか? ASyncTask? 別スレ?どうすればこれを行うことができますか?次のような ASyncTask で試しました。

private class MyTask extends AsyncTask {

    @Override
    protected Object doInBackground(Object... objects) {
        return getActivity().getApplicationContext().startService(intent);
    }

    @Override
    protected void onCancelled() {
        getActivity().getApplicationContext().stopService(intent);
        super.onCancelled();
    }
}

そうそう、これはフラグメントの内部にあるため、getActivity().getApplicationContext() を使用しています。

したがって、これは正常に機能します。開始したいときは MyTask.execute() を呼び出し、停止したいときは MyTask.cancel(true) を呼び出しますが、本来の使い方をしていないと確信しています。execute メソッドの引数として何を使用すればよいかさえわかりません (??)。そして、その中でサービスを開始するだけで、他には何もしないのは最善の考えではないようです。確かに、スレッドだけを使用したほうがうまくいくでしょうか? 意図したとおりに機能させるために、これを行う適切な方法は何ですか? ところで、これはメイン スレッドで実行するよりもはるかに長く機能しますが、数時間後にはクラッシュします。

4

4 に答える 4

3

非同期タスクを使用して、Android でバックグラウンド タスクを実行できます。特定の状況でない限り、自分でスレッドを処理することはお勧めできません。非同期タスクは、ユーザーが別のビューに切り替えてもバックグラウンド スレッドで実行され、onProgress() update を使用して定期的にコールバックを取得することもできます。ここでは、非同期タスクを開始するための優れたチュートリアルをいくつか紹介します。非同期タスクは Android 開発で大いに役立つため、慎重に検討してください。

http://mobileorchard.com/android-app-developmentthreading-part-2-async-tasks/

http://www.vogella.com/articles/AndroidPerformance/article.html

公式ドキュメントは次のとおりです: https://developer.android.com/reference/android/os/AsyncTask.html

于 2012-10-05T05:25:41.350 に答える
1

更新:私はそれを理解したと思います。どうやら私が持っていたサービスの種類については、フォアグラウンドで実行するだけでよかったようです (したがって、startForeground() メソッドを使用します)。それは今働いているようです。ごめん!

于 2012-10-07T04:03:53.033 に答える
0

バックグラウンド スレッドで startService を呼び出しても、サービスはバックグラウンド スレッドで実行されません。Async Task を使用せずに、通常どおり startService を呼び出す必要があります。サービスでは、作業を行うための新しいスレッドを作成する必要があります。このサービスは無期限に実行できるため、ここでは AsyncTask を使用しないでください。これは定義済みのタスクではありません。

于 2012-10-05T05:31:33.133 に答える
0

イベントスレッドとは別のスレッドでサービスを開始しないでください。代わりに、サービスで実行するのに長い時間が必要なコードがある場合は、そのコードをサービスクラスのみの別のスレッドに配置してください。

メイン アプリケーション以外のプロセスでサービスを実行するには、サービス内のマニフェスト ファイルでプロセス タグを定義する必要があります。

于 2012-10-05T05:23:14.767 に答える