2016-10-06 9 views
0

私の理解によれば、アンドロイドでは、サービスはUIスレッド上で実行されます。サービスがバックグラウンドでどのように動作するのか少し混乱します。UIスレッドをブロックしないといけませんか?彼らはどのようにしてメインスレッド上にあり、同時にバックグラウンドで実行できるのでしょうか?Android - サービスはどのようにバックグラウンドで実行できますか?

+0

https://developer.android.com/training/run-background-service/index.htmlを参照してください。 – sasikumar

答えて

0

自分でバックグラウンドで実行を簡単に整理できます。ただし、単一のコンシューマルなジョブを一度実行したい場合は、IntentServiceの使用を検討してください。別のスレッドで実行されて終了します。 一方、通常のサービスは無期限に実行され、それにバインドすることができます。 バックグラウンドタスクを整理するにはいくつかの方法があります - AsyncTask、別のスレッド、そして最も強力で便利な方法 - rxJavaライブラリを使用する

バックグラウンドスレッドで何らかの操作を実行し、 rxJavaとメインスレッド:

String arg = "132"; 
     Observable.defer(() -> Observable.just(arg)) 
       // start operation on background thread from 
       // thread pool 
       .subscribeOn(Schedulers.computation()) 
       .map(arg -> { 
        // do you processing here 
        String result = "123"; 
        return result; 
       }) 
       // switch to main thread 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(v -> { 
        // process results 
        Log.i("My service", "result: " + v); 
       }, error -> { 
        // handle error 
       }); 

あなたが見ることができるようにタスクの進行に伴い、これはバックグラウンド動作を管理する非常に便利な方法ですが、よりimportaint、あなたがスレッドを切り替えることができます。

0

サービスは、常にUIスレッド

上で実行されるしかし、あなたはUIスレッドでサービスを実行した場合、UIがブロックされます。

UIは、デフォルトでは、メインスレッドで実行

1

サービスをブロックされることはありませんが、彼らはバックグラウンドで実行するようにだから、スレッドやAsynctaskの助け以内にあなたは、SAPレート・スレッドを介してサービスを呼び出すことができますユーザーから見れば、Serviceを裏付ける画面はありません。

あなたはあなたのサービスのいずれか、バックグラウンドスレッドで実行Serviceサブクラスを使用して、独自のスレッドを提供したい場合は - 新しいThreadを経由して、JavaのExecutor枠組みを、RxJavaAsyncTask、またはワン」のIntentServiceサブクラスを使用します「ショット」タイプのタスクを実行します。

関連する問題