SurfaceViewでスレッドを使う

1.開発目標

このページの目標は、SurfaceViewでスレッドを使うことです。スレッドは、Javaに標準で搭載されている並列処理のためのクラスです。並列処理される内容はrunメソッドの中に書きます。

2.Runnableインターフェイスを実装する

スレッドを使うために本来ならThreadクラスを継承したいところですが、すでにSurfaceViewを継承しているのでできません。そこで、Java標準のRunnableインターフェイスを実装します。これは、runメソッドを持っています。

SampleSurfaceView.java

package sample.android.usingsurfaceview;

import android.content.Context;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.SurfaceHolder.Callback;

public class SampleSurfaceView extends SurfaceView implements Callback, Runnable {
    private SurfaceHolder holder;

    public SampleSurfaceView(Context context) {
        super(context);
        holder = getHolder();
        //callbackメソッドを登録
        holder.addCallback(this);
    }

    //サーフェイス変化で実行される
    @Override
    public void surfaceChanged(SurfaceHolder holder, int f, int w, int h) {
        super(context);
    }

    //サーフェイス生成で実行される
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
    }

    //サーフェイス破棄で実行される
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
    }

    @Override
    public void run() {
    }
}

3.スレッドを実行する

スレッドオブジェクトを作って、それを実行します。実行される内容は、runメソッドの中身になります。ちなみに、普通にrunメソッドを実行すると並列処理にはなりません。

SampleSurfaceView.java

package sample.android.usingsurfaceview;

import android.content.Context;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.SurfaceHolder.Callback;

public class SampleSurfaceView extends SurfaceView implements Callback, Runnable {
    private SurfaceHolder holder;
    private Thread thread;

    public SampleSurfaceView(Context context) {
        super(context);
        holder = getHolder();
        //callbackメソッドを登録
        holder.addCallback(this);
    }

    //サーフェイス変化で実行される
    @Override
    public void surfaceChanged(SurfaceHolder holder, int f, int w, int h) {
        super(context);
        //run()を実行
        thread = new Thread(this);
        thread.start();
    }

    //サーフェイス生成で実行される
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
    }

    //サーフェイス破棄で実行される
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        thread = null;
    }

    @Override
    public void run() {
    }
}

4.開発結果

まだrunメソッドが空なので何も描写されませんが、これでSurfaceViewにスレッドを実装することができました。実行してみます。

まだ、何も起こりません。でも、描画の準備は整いました。次回は、画像を表示します。