Androidアプリを作ってみる #19 -Surfaceview その2-

Surfaceviewを実装する

SurfaceHolder.Callbackを使う

本Blogの内容を試して、トラブルや故障の原因になったとしても責任は負えません。そんな危ないことはしていませんが、自己責任でお願いしますね。

前回Surfaceviewを使うためにSurfaceHolder.Callbackを実装するところまでやりました。これはSurfaceviewとアクセスするために必要なものらしいです。で、前回実装したものは以下なんですが、これって一体なんなんでしょうかね?(コード表示の色を変えてみました)

前回の記事

Androidアプリを作ってみる #18 -Surfaceview その1-

2017.01.19
にゃんこ
コールバックがよくわからん。

コールバック(メソッド)は何かの状態を検出した時に呼ばれるメソッドのことを言います。ここまでで出てきた「onCreate()」もAndroidのアクティビティが生成された時に呼ばれるという意味でコールバックメソッドですね。なのでかっこよくコールバックとか言いましたが深く気にすることもないようです。

にゃんこ
なら書くなって。
メリ
Z…zzzz…

上記で実装した3つのメソッドの役割を説明するとわかりやいかもです。
公式の仕様を見ても簡単に書いてあります。

SurfaceHolder.Callbackについて -Android Developers-

SurfaceHolder.Callback
surfaceCreated Surfaceviewが生成された時に呼ばれます。
surfaceChanged Surfaceviewが変更された時に呼ばれます。
surfaceDestroyed Surfaceviewが破棄される時に呼ばれます。

それぞれのタイミングで処理したいことがあれば、そこに記述していけばいいってことですね。
ん?でも以前言ってた「並列に処理した方がいい」ってのはどこに入れるんでしょうか!?

並行がどうのこうの言ってたやつ

Androidアプリを作ってみる #14 -Surfaceview?-

2016.11.15



スレッドを入れる必要がある

Runnableインターフェース

以前も並行処理させるためには、「スレッド」というものを入れなくてはいけないって書きました。その「スレッド」を作るために今度は「Runnableインターフェース」を実装します。

Runnableインターフェースの公式文書はちょっと難解な感じでしたが、スレッドという言葉が出てきているので合っているのでしょう。

The Runnable interface should be implemented by any class whose instances are intended to be executed by a thread. The class must define a method of no arguments called run.

Google先生の訳もアレな感じです。

Runnableインタフェースは、インスタンスがスレッドによって実行されることを意図している任意のクラスによって実装される必要があります。クラスはrunという引数のないメソッドを定義しなければなりません。

Runnableインターフェースを実装する場合は、runというメソッドを定義する必要があるわけですね。ちなみに引数というのはメソッドに渡すパラメータのことです。そのうち出てくるでしょうからその時にまた。

では、実装してみます。追加する場所はSurfaceHolder.Callbackの後に書けばいいだけです。

これを書くとまた赤い波線が表示されてしまいます。これがさっきの仕様でも言ってた「run」を定義する必要があるので「定義が無いよ!」って怒られてるわけですね。追加してやればこのエラーも取れます。

以前と同じように、メニューの「Code」→「Implements Methods…」を選択すると以下のように定義すべきメソッドが自動で表示されますのでそれを選択するだけで実装してくれます。

Android 定義すべきメソッド一覧

定義すべきメソッド一覧

できました。

runがスレッドになる

この追加された「run」メソッドが「スレッド」部分になります。でもこの「run」ってどこでどうやって実行されるんでしょうかね。この「run」メソッドはコールバックメソッドでは無いので自分で実行するタイミングを決めなくてはいけません。

じゃ、どこで実行するんでしょうか。っとここで登場するのが先ほどのコールバックメソッド達です。この中のSurfaceviewが生成されるタイミングの「surfaceCreated」が良さそうですね。

スレッドを実行させるには?

どうやって「スレッド」を起動させるかというと「Thread」というクラスを使って行います。そのままですね。「GameSurfaceview」内に「Thread」クラス変数を定義して、「surfaceCreated」内に以下のように記述するとスレッド(run)が実行されます。

次回はこの「run」メソッドの中をいじってみます。

メリ
Z…zzz…

前回の記事

Androidアプリを作ってみる #18 -Surfaceview その1-

2017.01.19