DX・デジタルトランスフォーメーション

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

ブロックチェーン・暗号技術 | android | iOS | Web | アプリの著作権 | 日本のなりたち | 禅・大乗仏教 | 新しい社会

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> {
  @Override
  protected List doInBackground(String... param) {
    // ここはサブスレッドで実行される
  }
  @Override
  protected void onPostExecute(List results) {
    // ここはメインスレッドで実行される
  }
}

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

2023年12月
     12
3456789
10111213141516
17181920212223
24252627282930
31      
android
iOS
web
アプリの著作権
ブロックチェーン/暗号技術
新しい社会
禅・大乗仏教
日本のなりたち

AppStoreにて無料公開中! ”システム手帳”で検索! - AppStoreへ iPad版 - iPhone版
デジタルトランスフォーメーションで新しい生活を提案!