Android 非同期処理についてまとめてみた


Androidには、UIに影響を与えないよういくつか非同期処理が用意されています。
今回は非同期処理の代表的な

・Service
・IntentService
・HandlerThread

について違いを踏まえながらまとめます!
非同期処理について(http://codezine.jp/article/detail/9746)

まずはServiceとIntentServiceについて説明します。

■ Service
・メリット
– Activityに依存せずに長時間のバックグラウンド処理に向いている。
– Contextを持っている。

・デメリット
– メインスレッド上(UIスレッド上)で動作するため、重い処理を行うと画面のレスポンスが遅くなったり、アプリが落ちる。

※Serviceの優位性
ServiceはActivityと同一のスレッドで動いているため、
Serviceを使わずにActivityからスレッドを生成すればいいのでは?と思った方がいるのではないでしょうか?
重要なのはServiceはContext(アプリの状態)を保持していることです。
Activityからでもスレッドは生成し処理を行うことは可能ですが、Activityが終了してしまうと、Activityに関連したContext(アプリの状態を保持した情報)は使用できなくなります。
そのため、Contextを利用したバックグラウンド処理にはServiceを使う必要があります。

■ IntentService
・メリット
– Activityに依存せず非同期の処理に向いている。
– 内部にHandlerThreadを持っているため、メインスレッドとは別のスレッド上で逐次処理を行う。

ServiceとIntentServiceの違いを見てみる

下記にServiceを使った処理とIntentServiceを使った処理を記載します。
ActivityからIntentを使ってService/IntentServiceを呼び出します。
・Activity

・Service(あえてfor文を使い重い処理を行う)

→アプリが落ちる。

・IntentService(あえてfor文を使い重い処理を行う)

→UIに影響を与えないため、アプリは落ちない。

次にHandlerとHandlerThreadについて説明します。

HandlerThreadについて

HandlerThreadは内部にLooperを持ち、Handlerによって送られてきたメッセージを逐次処理するための仕組みです。わからない用語が出てきたので、まずは”Looper”と”Handler”について説明します。

LooperとHandlerについて

Looperとは

Looperとは内部にMessageキューを持ち、順番にキューから取り出したメッセージを処理する仕組みです。
これはAndroidの基本的な仕組みとなっておりActivityやServiceなどもこのLooper上で動作しています(デバックしてみるとわかります。はい)。
そしてこのActivityやServiceは特別なメインルーパー(メインスレッド)で動作しており、画面に関するウィジェットの変更はメインルーパーで行わなければなりません。
※別スレで行うとエラーが出ます。

Handlerとは

HandlerとはそのLooperにMessage(タスク)を届けるためのメッセンジャーです。

HandlerとHandlerThreadの違いを見てみる

Handlerはメインスレッド上で行われています。
HandlerThreadは新たにThreadを生成して、そこで処理を行います。

→デバックして変数sの中身を確認する。
s = main
メインスレッド上の処理のため、重たい処理を記載するとアプリは落ちる。

→デバックして変数sの中身を確認する。
s = other
別スレッドを生成しているため、重たい処理を記載してもUIに影響を与えることはなくアプリが落ちる心配はない。
なるほどなるほど、ここで疑問。
Q 画面に関する操作はメインスレッド上で行わなければならないとのこと。もし、別スレッド上で行ったらどうなるのだろうか?

・結果
問題なく、ボタンが読み込まれました。
Handlerの引数(メインスレッドのLooper)にHandlerThreadのLooper処理の結果を渡してるから、
別スレッドの処理結果をメインスレッドに渡しているからなんだ。

(http://ichitcltk.hustle.ne.jp/gudon2/index.php?
pageType=file&id=Android010_Handler)
手順

1.別スレッド(HandlerThread)を生成
2.別スレッド開始
3.HandlerThreadインスタンス から Looperインスタンス 取得
4.Handlerインスタンスを生成(3で取得した Looperインスタンス を 引数指定)
5.4 で作成した Handlerインスタンス を使用(Handler#post 等)

参考
http://daichan4649.hatenablog.jp/entry/20111004/1317724067
https://realm.io/jp/news/android-thread-looper-handler/

UIスレッドからのみ画面操作が可能
http://dev.classmethod.jp/etc/22853/


DACエンジニア採用情報

  関連記事

Bootstrapのモーダル機能で多重表示する際に解決しなければならない2つの問題

はじめに みなさんこんにちは、プロダクト開発本部の亀梨です。 普段はXmediaOneというメディアプランニング・広告運用管理・トラッキング・マーケティング分析を行う 統合プラットフォームの開発・保守を担当しています。 エンジニアの皆さん、デザインってどうしてます? わたくしはプライベートでとあるW …

【小ネタ】タスク管理ツール移行: Trello から Asana

  プロジェクトチームのタスク管理ツールを Trello から Asana に変えることになり、 タスクの移行が意外と簡単にできた、というお話です。 Trello と Asana もともと使っていたのは Trello(トレロ)です。 プロジェクト > タスクグループ > タスク …

【未経験からのRuby on Rails – 第3回】変数と定数

こんにちは。新卒1年目のmatsuariです。 今回はRubyに限らずプログラミングを学ぶ上で非常に重要となる「変数と定数」について、ご紹介していきます。 変数とは・・・ オブジェクトを一時的に格納しておく箱で、オブジェクトを識別するために利用します。 言葉だけでは理解が難しいかと思いますので、まず …

SDKってどうやって作ってるの?【Android編】

こんにちは。4度目の投稿です。 現在私はAndroidのSDKを開発しています。 javaにもAndroidにもSDKにも手を出したのは初めてなので、最初はそもそもSDKのイメージが湧かず、ふわふわした状態で始めました。 SDKと調べても「あるソフトウェアを開発するために必要なプログラムや文書などを …

fastavroとjqでAVRO形式のファイルからデータを取得しよう

AVRO形式のファイルを取り扱いたい AVROとはApacheプロジェクトのひとつとして開発されているデータ交換形式です。 コンパクトなバイナリで高速なシリアライズ・デシリアライズが行えるため、サーバーログなどに利用されています。 弊社内での一部システムのログデータにも利用されているのですが、専用の …

Scala入門 準備編「開発環境構築」 – PHP使いからScala使いへ転身!

  はじめに みなさんこんにちは、今月入社しましたプロダクト開発本部の亀梨です。 普段はXmediaOneというメディアプランニング・広告運用管理・トラッキング・マーケティング分析を行う 統合プラットフォームの開発を担当しています。 XmediaOneの開発で採用しているプログラム言語はS …

Qiita Team API と Google Spread Sheet でチーム日報を生成する

チーム日報を活用する MarketOne 開発チームでは複数拠点に分かれての開発を行っています。リモート開発が中心となると口頭でのコミュニケーションに限界があるため、テキストベースのコミュニケーションの比重が高い状態にあります。 チケットシステムやソースコード管理ツール上の議論はもちろんおこなってい …

ECMAScript6を使ってみた ~「Promise」編

ECMAScript6とは 一応ちょっとだけ説明しておくと、 ECMAScript(エクマスクリプト)は、Ecma Internationalによって標準化されたスクリプト言語で、バージョン6が2015 年 6 月 17 日に標準仕様として発行されました。(以下、ES6と呼びます) ES6ではcon …

ディープラーニングで「顔が似ているAKB48のメンバーを教えてくれるbot」を構築

概要 こんにちは、システム開発部の中村です。 今回は、Facebook Messenger APIを利用して、 画像をアップロードすると、似ているAKB48のメンバーを教えてくれるbotを実装しました。 尚、ディープラーニングやTensorFlowそのものの解説というより、 「エンジンとしてディープ …

no image
AWSにRailsアプリをデプロイする(公開編)

次にデプロイするため“aws rails デプロイ”でググってみるとunicorn、nginxというキーワードがでてくるので とりあえずこれを設定していきます。   アプリのsecret_key_baseの設定 [crayon-5bf2bb2a7f64b184656 …