Androidの応答性を改善する

この記事は、まだ書きかけです。

前置き

DevGuideの"Designing for Responsiveness"などを読みつつ、要点をメモしていきます。

この記事は、まだ書きかけです。

本文

ANR

  • ANR(Application Not Responding)ダイアログ

ANRのトリガ

  • 入力イベントに対して5秒以内に反応しない
  • android.content.BroadcastReceiverが10秒以内に終わらない

ANRを避けるには?

  • 処理を子スレッドに出す
  • an asynchronous requestを使う(android.os.AsyncTaskのことか?)
  • 子スレッドの終了をThread.wait()やThread.sleep()で待ってはダメ
  • 非同期処理の完了通知のために、android.os.Handlerを子スレッドへ提供

BroadcastReceiverの場合は…。

  • 子スレッドに出せない(BroadcastReceiverの寿命は短いので)
  • Serviceを開始すべき
  • BroadcastReceiverからActivityを開始すべきでない
  • 何か表示したいならandroid.app.NotificationManagerを使え

StrictModeクラス

  • android.os.StrictMode
  • メインスレッド上でのファイルアクセスやネットアクセスを検出する
  • 開発時のみ使うこと
  • ApplicationやActivityのonCreate()で
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
        .detectDiskReads()
        .detectDiskWrites()
        .detectNetwork()   // or .detectAll() for all detectable problems
        .penaltyLog()
        .build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
        .detectLeakedSqlLiteObjects()
        .detectLeakedClosableObjects()
        .penaltyLog()
        .penaltyDeath()
        .build());
  • 隠しAPIのStrictMode#conditionallyEnableDebugLogging()を使うと、DropBoxへのログ出力を有効化できる
  • adbで読む
adb shell dumpsys dropbox data_app_strictmode --print

More tips

  • プログレスバー(android.widget.ProgressBar)
  • プログレスダイアログ(android.app.ProgressDialog)
  • 囲碁ゲームなら、考慮処理を子スレッドに
  • 起動時の初期化処理が重いなら、スプラッシュスクリーンを出すか、初期化処理を非同期に
Last modified:2011/07/01 11:09:16
Keyword(s):
References:[Androidアプリ開発]
This page is frozen.