Help us understand the problem. What is going on with this article?

Androidで非同期処理

More than 3 years have passed since last update.

概要

音楽プレイヤーを作ろうと思った際に(まだできていない。。。)
Androidで非同期をすることが多かったのでメモ程度に残しておきます。

Service

非同期で処理する際にずっと処理させ続けたい場合に
使用したりする。
例 音楽の再生
コードはこんな感じ

service.java
class xxxService extends Service {      
      @Override
      public void onCreate() {
          // 起動時に必要な処理
      }
      @Override
      public int onStartCommand(Intent intent, int flags, int startId){
            // startServiceが実行されるたびに呼ばれる(僕はstateパターンを適用してActivityとはやりとしている。
      }
}

AndroidManifest.xmlにも追加が必要
<service android:name=".xxxService" >
</service>

今回は音楽プレイヤーだったので音楽の再生が止まって待っている場合は
サービスを止めたかったのでOnCreate時に別スレッドを生成して止まっているか監視するようにしている。

AsyncTask

結構有名なので今更間もありますが。。。
非同期で実行して実行した結果をUIとかに反映するときに便利なクラス
個人的によくやるのがAsyncTaskにinterfaceを定義しておいて定義したinterfaceを
Activityに継承させてコンストラクタ時に継承したクラスをinterfaceとして受け取ってActivityへ非同期の結果を反映させる。

Async.java
public class Async extends AsyncTask<String, Integer, Object> {
    private HogeInterface listener;

    public Async(HogeInterface hoge) {
        listener = hoge;
    }

    @Override
    protected object doInBackground(String... arg) {
        // 非同期で実行される処理
        return new Object();
    }

    @Override
    protected void onPostExecute(Object result) {
        // 非同期完了時に呼ばれる コンストラクタで受け取った実装済みの処理を呼び出す
        listener(result);
    }

    // 実行結果を反映させたい処理を書く
    public interface HogeInterface {
        public void Hoge(Object o);
    }
}

ScheduledExecutorService

こいつはjavaに用意されているクラスです。こいつに非同期で実行したい処理を追加していった順番で処理してくれる。

例 SeekBarでバーを増やすとき(極端すぎる。。。)
seekbarを設定する例

ExecutorService.java
ExecutorService{
    private ScheduledExecutorService scheduled;
    public void SetUp(){
        // 1つずつスレッドを動作させていく
        scheduled = Executors.newSingleThreadScheduledExecutor();
         // 引数の1番目はRunnableインタフェースを実装したオブジェクトを指定
         // 2番目は、scheduleAtFixedRateメソッド呼び出し後から最初のタスクを実行するまでの準備期間を指定。ここでは、0。
         // 3番目は、タスクを実行する周期を指定します。ここでは、1000[ms]を指定(今回は一つのタスクしか登録してないからあまり意味はない)。
         // 4番目は、引数(2番目と3番目)で指定している値の単位を示す列挙型TimeUnitの値を指定。ここではTimeUnit.MILLISECONDSを指定しています。
         // 戻り値は、登録したタスクを表わすScheduledFutureインタフェース実装オブジェクト。
        scheduledEx.scheduleAtFixedRate(new Seek(), 0, 500, TimeUnit.MILLISECONDS);

    }
    private class Seek implements Runnalbe {
        @overreid
        public void run() {
            // seekbarを設定する処理
        }
   }
}

まとめ

音楽プレイヤーを作っていく際に必要そうなものだけ記述しているので実際はもっとたくさんあると思います。個人的な備忘録も含めて書いています。もっとシンプルにかけたり面白い方法とかご存知の方がいらっしゃれば是非教えて頂きたいです。今年中には何とか出しておきたい。。。

gumi
Python、Erlang、Elixir などちょっと変わった技術でゲームをつくったりする会社。プログラマだけじゃなく、企画、デザイン、イラストなど開発全般揃ってます。
http://gu3.co.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした