33971


【やりたいこと】  
Android にて非同期で複数の処理をしようと考えています。  
処理 A, B, C... があり、全ての処理が終わったところで UI側にreceiver.sendしたいです。

【やってみたこと】  
Activityから X_IntentServiceを呼び、  
そこから A_IntentService, B_IntentService というように複数の処理を行い、  
全て終わったところで X_IntentServiceから `receiver.send()` しようとしたら  
A,Bなど各IntentServiceにて receiver.send()した時に以下のExceptionになってしまいます。

[code]

    java.lang.RuntimeException: Handler (android.os.Handler) {656e5a68} sending message to a Handler on a dead thread
    
[/code]

そもそも`IntentService`から `IntentService` は呼べない仕組みなのでしょうか？  
A_IntentServiceから receiver.send() した時には X_IntentService
の処理がすでに終わってる、ということでしょうか。  
また、こう言ったケースのベストプラクティスはありますか？


CC BY-SA 3.0
2017-04-05T07:31:45.073
33787
2017-07-03T12:53:26.863
2017-04-05T09:18:43.297
20888
20888
question
android java 非同期
Android 非同期で複数の処理


通常のJavaのthread(ワーカースレッド)を使用し、join(待ち合わせ)後に処理を開始すればよいと思います。  
前の方が記述されておりますが、GUIでないスレッド(メインスレッド)から画面を操作するとアプリケーションが異常終了するので、画面を操作する処理の場合はHandlerを使用する必要があります。

注意点として、Activityでthreadを起動した場合、画面遷移(onPouse or
onDestroy)の動作でthreadが動作停止してしまいます。  
上記は、Activityではなく、Serviceからthreadを起動させ、バックグランドで常駐させる事で回避が可能です。この辺りはアプリの実装に依存します。

簡単に纏めると、AndroidのServiceは画面遷移を複数挟んでも継続して欲しい処理に対して使用し、その中で並列で走らせたい処理があった場合は、thread等の非同期処理を使用する。が、実装としてシンプルではないでしょうか。

質問の内容の処理なら、サービスを複数起動する必要はないと思います。


CC BY-SA 3.0
2017-04-13T03:42:11.000
33971
2017-04-13T03:42:11.000
22484
33787
answer


別スレッドからUIスレッドへの橋渡しとなるHandlerを使用

[code]

        Handler handler= new Handler();
    
     public void onClickButton(View v) {
       new Thread(new Runnable() {
    @Override
    public void run() {
      // マルチスレッドにしたい処理 ここから
    
      final String result = getMessage(); // 何かの処理
      handler.post(new Runnable() {
        @Override
        public void run() {
          msgView.setText(result); // 画面に描画する処理
        }
      });
    
      // マルチスレッドにしたい処理 ここまで
    }
    
[/code]

}).start();  
}


CC BY-SA 3.0
2017-07-03T12:53:26.863
36072
2017-07-03T12:53:26.863
23205
33787
answer