본문 바로가기

코드조각모음

[android015] SurfaceView, UI스레드와 Rendering스레드 분리 예제

import android.app.*;
import android.content.*;
import android.graphics.*;
import android.os.*;
import android.view.*;

public class SurfaceViewTest extends Activity
{
    FastRenderView renderView;
   
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(
                WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
       
        renderView = new FastRenderView(this);
        setContentView(renderView);
    }
   
    protected void onResume()
    {
        super.onResume();
        renderView.resume();
    }
   
    protected void onPause()
    {
        super.onPause();
        renderView.pause();
    }
   
    class FastRenderView extends SurfaceView implements Runnable
    {
        Thread renderThread = null;
        SurfaceHolder holder;
        volatile boolean running = false;
       
        public FastRenderView(Context context)
        {
            super(context);
            holder = getHolder();
        }
       
        public void resume()
        {
            running = true;
            renderThread = new Thread(this);
            renderThread.start();
        }
       
        public void run()
        {
            while(running)
            {
                if(!holder.getSurface().isValid())
                {
                    continue;
                }
                Canvas canvas = holder.lockCanvas();
                canvas.drawRGB(255, 0, 0);
                holder.unlockCanvasAndPost(canvas);
            }
        }
       
        public void pause()
        {
            running = false;
            while(true)
            {
                try
                {
                    renderThread.join();
                    break;
                }
                catch(InterruptedException e)
                {
                    //재시도
                }
            }
        }
    }
}