ICT ERA + ABC 2012 Tohoku

Post on 28-May-2015

2.651 views 1 download

Transcript of ICT ERA + ABC 2012 Tohoku

「Google Androidプログラミング入門」出張所Androidでのスレッドの基礎

ICT ERA + ABC 2012 東北

2012/10/20 江川 崇 ( EGAWA Takashi )

12年10月20日土曜日

Androidアプリ開発者向けに、Androidアプリにおけるスレッド管理の基礎知識をお話しします。アプリのプロセス・スレッドメッセージループAsyncTask Handler Looper Service   など

お話しすること

12年10月20日土曜日

アプリのプロセス・スレッド

12年10月20日土曜日

アプリのプロセス・スレッド

スレッド(メインスレッド)

プロセス

アプリ1

スレッド(メインスレッド)

プロセス

アプリ2

Androidアプリを起動すると 専用のプロセスが生成される そのプロセス上でひとつのスレッドが生成される

・・・

12年10月20日土曜日

アプリのプロセス・スレッド

スレッド(メインスレッド)

プロセス

アプリ1

スレッド(メインスレッド)

プロセス

アプリ2

Androidアプリを起動すると 専用のプロセスが生成される そのプロセス上でひとつのスレッドが生成される

アプリ毎に ・専用の1プロセス・あらゆる処理を実行する1スレッド

12年10月20日土曜日

長所アプリ間はプロセスの壁で守られている悪意のあるプログラムや品質の低いプログラムが他のプログラムへ影響を及ぼしにくい

シンプルな1本のスレッドメインスレッドだけで全ての処理を行うため、シンプルでわかりやすく、バグを生みにくい

12年10月20日土曜日

懸念超多忙なメインスレッドメインスレッドのほぼ全ての役割が画面の描画とユーザーからの操作の受付で占めるパフォーマンス面で限界がある時間がかかる処理を実行できない

適宜並行に、画面の状況に依存せずに処理を行う必要がある

12年10月20日土曜日

メッセージループ

12年10月20日土曜日

メッセージループ以下の図の繰り返しを実現しているものメインスレッドはメッセージループを実施している

メッセージキュー

キューの先頭からひとつ取り出して処理

依頼する処理をキューの末尾に入れる

12年10月20日土曜日

ANRANR (Application Not Responding) メインスレッドがメッセージキューから取り出した処理の実行に約5秒以上かかると発生

12年10月20日土曜日

説明のお題Weather サンプルアプリ日本全国の現在の天気をリストで表示APIの呼び出し、XMLのパース、Viewへの表示といった処理を都道府県分(47回)繰り返すz

goo.gl/eFF4D

12年10月20日土曜日

AsyncTask

12年10月20日土曜日

スレッドをブロックせずに非同期に他の処理を実行できるAndroidのユーティリティクラス

メインスレッドと並行に処理を実行し、その結果をメインスレッドで手軽に受け取れる

AsyncTask

例)進捗ダイアログ進捗更新や画面描画はメインスレッド実際の処理は別スレッド

※画面更新 (Viewの操作)をメインスレッド以外で実施することはできない

12年10月20日土曜日

AsyncTaskスレッドプールタイプ複数のタスクを並行で実施高速だがメモリ消費が激しい

シリアルタイプ各タスクを1つずつ順番に実行端末に優しいが後続のタスクの実施が遅れる

タイプ 2.3以下 3.0以上スレッドプール 標準 ○シリアル × 標準

12年10月20日土曜日

AsyncTask (シリアル)

12年10月20日土曜日

AsyncTask (シリアル)

12年10月20日土曜日

AsyncTask (プール)

12年10月20日土曜日

AsyncTask (プール)

12年10月20日土曜日

スレッド

12年10月20日土曜日

スレッド

12年10月20日土曜日

AsyncTaskすごく楽に使えるが、仕組みを知らないとハマる&品質の悪いプログラムになるので、理解して使う

例)特性(実行タイプ)の違いバージョンごとに異なる特性どのスレッドで実施すべき(実施される)かキューはアプリで1つインスタンスの再利用不可

12年10月20日土曜日

参考)AsyncTaskLoaderデータをロードするローダー( Loader )という仕組みと AsyncTask を組み合わせた便利なクラス

データのロードと画面更新(AdapterによるViewとのバインド)が非同期に手軽に行える

12年10月20日土曜日

参考)Java SE標準クラスAndroidにも java.util.Thread や java.util.concurrent パッケージがあり、利用可能。

デバイスのリソースを考慮した設計を心掛ける必要がある

AsyncTaskのonPostExecuteのようなメインスレッドに処理を渡す方法が無い(Handlerなどを利用する)

12年10月20日土曜日

Handler, Looper

12年10月20日土曜日

Handlerメインスレッド外からメインスレッドのメッセージキューに対してメッセージを送信できるクラスAsyncTaskを使わずとも(Java SE標準のThread等から)メインスレッドとやり取りできる

12年10月20日土曜日

LooperメッセージループとメッセージキューのAndroid実装スレッドごとに生成可能メインスレッドのメッセージループにも使われている

メインスレッドの L o o p e r( m a i n L o o p e r )

別スレッドの L o o p e r

12年10月20日土曜日

Handler(より正確に)インスタンス生成( new Handler() )を実行したスレッドのメッセージキューに対してメッセージを送信できるクラス

例)メインスレッド上で生成した Handler は、メインスレッドのメッセージキューに対応する

12年10月20日土曜日

Looper

12年10月20日土曜日

Looper

12年10月20日土曜日

Service

12年10月20日土曜日

Service

12年10月20日土曜日

Service

12年10月20日土曜日

Service画面と依存せずに処理をするために設けられたAndroid専用の仕組み

Androidの他のコンポーネントとのやり取りが楽メソッド単位で外部に公開可能 (AIDL)標準ではメインスレッドで動作死んでも何度でも復活

参考)IntentService 処理依頼を受け取って処理するServiceを簡単に記述できるよう拡張されたクラス

12年10月20日土曜日

Service  Androidの初期からある仕組みで、利用しているアプリケーションも多いコードの記述量が増え、覚えなければならないルールも多い。他の仕組みで要件を充分満たせる場合には利用を避けてもよい。

Looper  Handlerと組み合わせて手軽に使えるちょっとした軽量デーモンを簡単に作りたいケースなどに向いている

ServiceとLooper

12年10月20日土曜日

Androidアプリを起動すると、アプリ専用にひとつのプロセスが新たに生成される。そしてこのプロセス上にひとつのメインスレッドが生成される。

アプリで行われる全ての処理はメインスレッドで行われるが、アプリは、ユーザーからの入力を常に受け付けられる状態を保たなければならないため、メインスレッドのほぼ全ての役割が画面の描画とユーザーからの操作の受付で占められる

まとめ

12年10月20日土曜日

Androidには、画面に影響を与えることなく、必要に応じて何らかの別の処理を並行して行う様々な仕組みが設けられている

処理の複雑さや求めるパフォーマンスに応じて、デバイスのリソースを考慮しながら最適な方法が何であるかを考えて利用することが、品質よくデバイスに優しいアプリに繋がる

まとめ

12年10月20日土曜日

江川 崇(EGAWA Takashi)

Smartium株式会社�(http://smartiums.com) 代表取締役Androidプログラミング入門 改訂2版(アスキーメディアワークス)Google Developers Expert情報技術開発(株)・(株)トップゲート�技術顧問IMoNi、L10N

twitter:@t_eggGoogle+:t.egawa@gmail.com

12年10月20日土曜日

Google Android プログラミング入門改訂2版江川崇、神原健一、山田暁通、佐野徹郎、郷田まり子 共著

定価 :3,570円 (本体3,400円) 発売日:2012年8月31日 形態 :B5変 (448ページ) ISBN :978-4-04-886068-0

アスキー・メディアワークス達人出版会からPDF版もあり

サンプルを全て詰めたアプリアリマスhttps://play.google.com/store/apps/details?id=jp.asciimw.androidbook

12年10月20日土曜日

ありがとうございました何か質問は?

江川 崇 (EGAWA Takashi)12年10月20日土曜日