スマートフォンアプリ作成

AppStoreにて無料公開中! ”システム手帳”で検索! - AppStoreへ iPad版 - iPhone版

androidでマルチスレッドを実現する4通りの方法

androidでのマルチスレッドプログラミングについて

iOSではGCD(グローバルセントラルディスパッチ)とBlocksを利用することで簡単に分かりやすくマルチスレッドを実装することができる。

androidはJavaのThreadをそのまま使用するが、シリアルキューを実現するためには Handler を使用することになる。

androidはDalvikVMというプロセス内で複数のアプリが実行されるので、インスタンス変数が格納されるヒープメモリのGC(ガーベージコレクション)やヒープメモリキャッシュの影響などによりThread間でメモリ領域を共有する際に想定外の動作をする場合があるので注意が必要となる。

<iOS>

iOSにはGCDという実にC言語のメリットを生かしたframeworkによって、マルチスレッドが簡単に実装することができる。

・コンカレントキュー


dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  // ここはサブスレッドで実行される
});

・シリアルキュー


dispatch_async(dispatch_queue_create("serial_queue_name", 0), ^{
  // ここはサブスレッドで実行される
});

<android>

androidでマルチスレッドを実現するには次の4通りの方法がある。

android(Java)のスレッドにはコンカレント、シリアルの概念がない。

Threadはコンカレントキューで実装されている。

シリアルキューを実装するためには、Handler#postを使用する。

・Thread無名クラス

Javaでマルチスレッド手続きを行うもっとも簡単な方法

Looperには対応していない


(new Thread(new Runnable() {
  @Override
  public void run() {
    // ここはサブスレッドで実行される
  }
})).start();

・Thread

Java標準のスタンダードな方法

Looperには対応していない


// Runnableを継承したクラスを定義して
public class RannableClass implements Runnable {
  public RannableClass() {
    // コンストラクタ
  }

  @Override
  public void run() {
    // ここはサブスレッドで実行される
  }
}

// サブスレッドで実行開始する
RannableClass rannableClass = new RannableClass();
Thread subThread = new Thread(rannableClass);
subThread.start();

・HandlerThread

Looperに対応しているので、Handlerで逐次RunnableやMessageをキューイングしたい場合に使用する。

シリアルキューを実装したい場合に使用する。


// サブスレッドを実行開始する
HandlerThread thread = new HandlerThread("sub_thread_name");
thread.start();
// HandlerによってRunnableをサブスレッドにキューイングする
Handler handler \= new Handler(thread.getLooper());
handler.post(new Rannable() {
  @Override
  public void run() {
    // ここはサブスレッドで実行される
  }
});

・AsyncTask

ネットワーク通信を伴うファイルダウンロードなどの場合に使用する


// インナークラスを作って
private class DownloadTask extends AsyncTask<String, Void, List<RssXmlParser.Entry>> {
  @Override
  protected List<RssXmlParser.Entry> doInBackground(String... param) {
    // ここはサブスレッドで実行される
  }
  @Override
  protected void onPostExecute(List<RssXmlParser.Entry> results) {
    // ここはメインスレッドで実行される
  }
}

// サブスレッドで実行開始する
new DownloadTask().execute(url, fileName);

2018年11月
    123
45678910
11121314151617
18192021222324
252627282930 
android
iOS
アプリの著作権
ブロックチェーン/暗号技術
日本のなりたち

AppStoreにて無料公開中! ”システム手帳”で検索! - AppStoreへ iPad版 - iPhone版
スマートフォンアプリ作成