Androidでマルチスレッド処理をする方法
Androidでマルチスレッド(マルチタスク・バックグラウンド処理)をするには次の方法があります。
[参考記事] UIを操作するのにhandlerを使う理由 thread WebViewCoreThread exiting due to uncaught exception
Java標準のThreadクラスを使用する方法
Android独自のAsyncTaskを使用する方法
Java標準のThreadクラスを使用する方法
Androidアプリはマルチスレッドで動作することができますが、UIはシングルスレッドモデルです。
このためメインスレッドのUI以外のスレッドからUIにアクセスすると例外が発生します。
次のように別スレッドでUIにアクセスすると例外が発生します。
public void onClickButton(View v) {
new Thread(new Runnable() {
@Override
public void run() {
// マルチスレッドにしたい処理 ここから
String result = getMessage(); // 何かの処理
msgView.setText(result); // 画面に描画する処理
// マルチスレッドにしたい処理 ここまで
}
}).start();
}

そこで別スレッドからUIスレッドへの橋渡しとなるHandlerを使用します。
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); // 画面に描画する処理
}
});
// マルチスレッドにしたい処理 ここまで
}
}).start();
}

[参考記事] UIを操作するにはhandlerを使う thread WebViewCoreThread exiting due to uncaught exception
Android独自のAsyncTaskを使用する方法
AndroidではAsyncTaskクラスというマルチタスク(非同期処理)用のクラスがあります。
AsyncTaskクラスのサブクラスを作成し、onPreExecute()、doInBackground()、onPostExecute()をオーバーライドして使用します。
| onPreExecute | 前処理 |
| doInBackground | バックグラウンドで動かす処理 |
| onPostExecute | 終了時の処理 |
AsyncTaskのサブクラス化する際にAsyncTask<Param, Progress, Result>という形で、doInBackground()の引数、進捗具合を表すパラメータ、doInBackground()の戻り値(=onPostExecuteの引数)をテンプレート引数に渡すようになっています。
package com.example.test;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
public class ThreadSample extends Activity implements OnClickListener{
TextView mTextView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//TextView取得
mTextView = (TextView)findViewById(R.id.TextView1);
//TextViewタップ時にonClick実行
findViewById(R.id.TextView1).setOnClickListener(this);
}
@Override
public void onClick(View arg0) {
// スレッド起動
new AsyncAppTask().execute();
}
class AsyncAppTask extends AsyncTask<Void, Void, String>{
@Override
protected void onPreExecute() {
// ここに前処理を記述します
// 例) プログレスダイアログ表示
}
@Override
protected String doInBackground(Void... arg0) {
// バックグランド処理をここに記述します
return "Thread Samples";
}
@Override
protected void onPostExecute(String result) {
// バックグランド処理終了後の処理をここに記述します
// 例) プログレスダイアログ終了
// UIコンポーネントへの処理
mTextView.setText(result);
}
}
}
関連記事
- OracleとGoogleとのJavaについての訴訟
- 画面UIパーツのclass一覧
- ListViewにArrayAdapterを渡すサンプルコード(一覧項目から選択する場合のUI)
- assetsフォルダのファイルを扱う方法 AssetManager
- AndroidManifest.xml の permission一覧
- SDカードが接続されているかどうか知る方法 書き込み可能かどうか 読み込み可能かどうか
- SDカードの空き容量を調べる方法
- Colorクラスでの色指定
- 画像を解像度ごとに振り分ける方法 国際化する方法(drawable、layout、valuesなどの修飾句)
- Mobile Network Code(MNC)の一覧[V-Z]
- Mobile Network Code(MNC)の一覧[T-U]
- Mobile Network Code(MNC)の一覧[S]
- Mobile Network Code(MNC)の一覧[O-R]
- Mobile Network Code(MNC)の一覧[M-N]
- Mobile Network Code(MNC)の一覧[J-L]
- Mobile Network Code(MNC)の一覧[H-I]
- Mobile Network Code(MNC)の一覧[E-G]
- Mobile Network Code(MNC)の一覧[C-D]
- Mobile Network Code(MNC)の一覧[A-B]
- Androidマーケットに表示されるアプリはSIMで制限されています
- Mobile Country Code(MCC)の一覧
- SDカードからサムネイル画像を取り出す getThumbnailメソッド
- 文字列の置き換えを行う方法 (replaceAllで気をつけること)
- 文字列の部分一致検索を行う方法
- 処理中を表すプログレスダイアログを表示する
- res/xmlフォルダの1MB以上のxmlファイルは読み込めない
- apkファイルインストール時のエラー一覧
- Java メモリー使用量を取得する方法
- Activityのメソッド順
- SDカードに保存したファイルをギャラリーなどに反映させる方法
- アプリケーションプロセスを強制的に終了する方法
- res/drawableの画像を変更しても、変更が反映されない場合
- Singletonパターンを使ってクラスのインスタンスを1つにする(共有クラスのリソースを削減する方法)
- apkファイルのインストール時に INSTALL_FAILED_INSUFFICIENT_STORAGE と出る場合
- AndroidアプリでTextViewに使用できるフォントの一覧
- TextViewに独自フォントを使用する方法
- assetsフォルダには1MB以上の非圧縮ファイルを設置できない
- コマンドプロンプトの文字コードを変える方法
- EditTextのソフトキーボードの『完了』を虫メガネアイコンなどに変更する方法
- Viewの表示・非表示を切り替える方法
- apkファイルをAndroid端末にUSB接続でインストールする方法 (開発者ではない人向け)
- Xperia(Sony Ericsson)のUSBドライバをインストールする方法
- リソースファイルの設置場所と利用方法
- OSのバージョンと特徴
- 画像を拡大縮小する方法
- LinearLayout をスクロールさせる方法(ScrollViewの使用方法)
- タイトルバーやステータスバーを非表示にする方法
- ステータスバーの高さを取得する方法
- 画面解像度などディスプレイの情報を取得する方法
- アプリ起動時にスプラッシュ画面を表示させる方法
- 最初に呼び出されるJavaファイル(Activity)を指定する方法
- WebViewの設定一覧
- WebViewで横の隙間を消す方法(スクロールバー領域を消す)
- layoutのbackgroundで透過(transparent)を指定する方法
- Android実行時にError:ShouldNotReachHere() [hs_err_pid.log]
- WebViewを使ってWebサイトを表示する方法 WebKitからアプリ、アプリからWebKitへの連携処理
- UIを操作するのにhandlerを使う理由 thread WebViewCoreThread exiting due to uncaught exception
- アプリが実行されるまでの流れ ソースコードから実行まで
- deleteOnExit()メソッドは環境によって動作が違う JVM+Windows
- [暗号化]ブロック暗号とは(AES/DES/Blowfish PKCS5Padding ECB/CBC IV)
- MediaPlayer のメソッド一覧
- EclipseのビューをカスタマイズしてファイルエクスプローラやLogCatを表示する
- xmlファイルの開始タグと閉じタグは大文字小文字も同じにする
- 動画を再生する方法 MediaPlayer
- 動画を再生する方法 VideoView
- Androidのソースファイルを入手する方法
- テーマ機能を使ってアプリケーション全体にスタイルを適用させる方法
- スタイルを使って属性を一括で管理する方法
- よく使うUIパーツのプロパティ
- wrap_contentとfill_parentの違い
- Androidのlayoutで使用できるパーツの一覧 ビュー(部品)
- ターミナルで端末操作をする方法
- アプリケーションのログを見る方法
- ログの出力 アプリのステータスを確認する
- layoutの種類と使用方法
- 画面の向きによってレイアウトを変更する方法
- Java標準以外のライブラリ(パッケージ)を読み込む方法 jarファイルを追加する
- apkファイルをサーバから端末にダウンロードする
- build.propの設定値
- 2.0/2.1以前で再生できる動画が2.2以降で再生できない
- /data/anr/traces.txtファイルとは
- プロジェクトが実行ができない main.out.xml string.out.xml
- Android Maps API Keyを取得する方法 Google Mapsを利用する
- 実機内やエミュレータ内のファイルを操作する DDMS、adbとサンプルコード
- EclipseでAndroidプロジェクトを作る方法
- iPhoneアプリやAndroidアプリを簡単に作成する方法 ハイブリッドアプリケーション
- Android公式の開発者向けサイト
- アプリからネットワーク通信を行う場合
- Androidアプリの開発環境を作る方法
- 実機のスクリーンショットをとる方法
- 開発中のアプリケーションを実機でテストする方法
- 横画面に固定する、縦画面に固定する(表示モードの固定)
- EditTextで改行させない方法
スポンサーリンク





