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エンジニア採用情報

  関連記事

logomono-tableau-software-mono
Tableauを利用してMySQLとRedshiftのクロスDBジョインを実現する

はじめに RedshiftやTreasureDataなどのデータマート用のDBにはID単位の解析結果が格納され、ローカルのMySQLにはIDに紐づいた名称マスタが管理されている構成の場合、データマートのクロス集計結果に対してIDに紐づいた名称を付与したいことがあります。 データマート用に用意したDB …

shogi
ナイーブベイズで羽生さんと羽生くんを分類してみた

はじめに こんにちは。システム開発部の中村です。 機械学習についての理解を促進するため、 データから分類モデルを自動で構築する古典的な方法である、 ナイーブベイズ分類器を実装してみました。 最近はCloudVisionAPIなど専ら画像解析が流行っていますが、 自分のような初学者には敷居が高そうだっ …

swift
iOS端末情報をTreasureDataに送るアプリをswiftで作ってみた。

はじめまして、2年目のOyamanです。 通常業務とは別のことになりますが、Swiftに触れる機会が少しあったので、スマホ関連の記事を書かせていただきます。 はじめに SwiftとTreasureDataのSDKを使って、 iOSの端末情報をTreasureDataへ送るアプリを作ってみます。 今回 …

no image
【未経験からのRuby on Rails – 第1回】楽しく書けるプログラミング言語 “Ruby” とは

こんにちは、はじめまして。新卒1年目のmatsuari(女子)です。 この度、Rubyの勉強を始めることになりまして、 まずはたくさんあるプログラミング言語の中で、なぜ自分がRubyを学ぶのか? しっかりと把握した上で学習に取り組んでいきたいと考え、『Rubyとは何か?』調べました。 超基礎的なこと …

question
読み方がわからない技術用語 2015

英語圏での読み方を基本的には参考にしています。英語圏でも複数の読み方をしているケースもあるようなので、あくまでも参考程度。2015と書きながら、古い言葉も混じってますが。 async – えーしんく Alt – おると ASUS – えいすーす bower &#8 …

no image
Polymer on Rails

Web Componentsをご存知だろうか。これが普及すればWebの開発は画期的に変わるだろう。 説明すると長くなるので、LIGさんのにその辺はお任せして。(この記事読んでください。) 簡単に言えば、下記にあるような新たに提案されたブラウザ向けAPIの総称。 Custom Elements, 説明 …

14391226325_8c35c2a652_z
D3.jsとその活用事例について

D3.jsとは? D3とは「Data Driven Document」の略で、データに基づいてドキュメントを操作するための JavaScript ライブラリです。 ご存知の方も多いと思いますが、ちょっとだけD3.jsの基本的な使い方、そして弊社プラットフォームでの利用についてご紹介したいと思います。 …

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

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

no image
gulp.jsで広告タグの開発環境を整える

SEOの観点から、サイト表示速度の高速化のためJavaScriptファイルから不用な空白や改行、 コメントを除去したりやローカル変数名を短縮するminifyが奨励されていますが、 これはタスクランナーのgulp.jsとプラグインを使って自動化する事が可能です。 ※gulpの基本的な使い方については下 …

image2
自社サービスのDocker化(前編)

こんにちは。 インフラ開発部の上田です。 普段は自社開発システムのインフラ担当として、日々頑張って仕事をしています。 今回は、近年話題になっているDockerについて、取り上げてみようと思います! なぜDockerなのか・・・? そもそもDockerとは何か・・・?   当社では様々なサー …