2015-02-13 2 views
0

Я нашел несколько примеров кода для создания головоломки, и я заметил, что у них есть класс Thread, который расширяет Thread и делает такие вещи, как отслеживание состояния головоломки и даже устанавливает свойства вид поверхности, который используется для головоломки.Как преобразовать расширение класса Thread для реализации Runnable

Я хочу переместить этот код в Run(), выполнив Runnable. Я прочитал, что внедрение Runnable лучше, чем расширение Thread, но я понятия не имею, как это сделать. Ниже приведен класс, который вызывается из пользовательского вида поверхности. Я хочу вместо этого реализовать Runnable в этом классе поверхностного вида (я думаю, это хорошо). Заранее спасибо.

public class ThreadHelper extends Thread { 

    private SurfaceHolder mHolder; 
    private PuzzleSurface mPuzzleSurface; 
    private ThreadHelper mThread; 

    private int gameState; 
    private int puzzleSurfaceWidth = 1; 
    private int puzzleSurfaceHeight = 1; 
    public static final int STATE_PAUSE = 1; 
    public static final int STATE_RUNNING = 2; 
    private boolean isRunning = false; 

    public ThreadHelper(SurfaceHolder holder, PuzzleSurface puzzleSurface) { 
     mHolder = holder; 
     mPuzzleSurface = puzzleSurface; 
    } 

    /** 
    * Return running thread 
    * @return 
    */ 
    public ThreadHelper getThread() { 
     return mThread; 
    } 

    /** 
    * Stop running thread 
    */ 
    public void destroy() { 
     synchronized (mPuzzleSurface) { 
      if (isRunning) { 
       isRunning = false; 
      } 

      if (mThread != null) { 
       mThread.interrupt(); 
       mThread = null; 
      } 
     } 
    } 

    /** 
    * Method pauses game state 
    */ 
    public void pause() { 
     synchronized (mPuzzleSurface) { 
      if (gameState == STATE_RUNNING) { 
       setState(STATE_PAUSE); 
      } 
     } 
    } 

    /** 
    * Method sets game state to running 
    */ 
    public void unpause() { 
     setState(STATE_RUNNING); 
    } 

    /** 
    * Method is used to set the game state to either paused (1) 
    * or running (2) states 
    * @param stateToSet 
    */ 
    public void setState(int stateToSet) { 
     synchronized (mPuzzleSurface) { 
      // TODO Message Handling 
     } 
    } 

    /** 
    * Called to retrieve per-instance state from an activity 
    * before being killed 
    * @param outState 
    * @return outState instance 
    */ 
    public Bundle saveState(Bundle outState) { 
     synchronized (mPuzzleSurface) { 
      if (outState != null) { 

      } 
     } 
     return outState; 
    } 

    /** 
    * Called to set the size of the surfaceView 
    * @param width 
    * @param height 
    */ 
    public void setSurfaceSize(int width, int height) { 
     // synchronized to make sure these all change atomically 
     synchronized (mPuzzleSurface) { 
      puzzleSurfaceWidth = width; 
      puzzleSurfaceHeight = height; 
     } 
    } 

    /* (non-Javadoc) 
    * @see java.lang.Thread#getState() 
    */ 
    @Override 
    public State getState() { 
     // TODO Auto-generated method stub 
     return super.getState(); 
    } 

    /** 
    * Method used to set running state of thread 
    * @param run 
    */ 
    public void setRunning(boolean run) { 
     isRunning = run; 
    } 

    /* (non-Javadoc) 
    * @see java.lang.Thread#run() 
    * Calls the run() method of the Runnable object the 
    * receiver holds 
    */ 
    @SuppressLint("WrongCall") 
    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     while (isRunning) { 
      Canvas c = null; 
      try { 
       c = mHolder.lockCanvas(null); 
       synchronized (mHolder) { 
        mPuzzleSurface.onDraw(c); 
       } 
      } finally { 
       if (c != null) { 
        mHolder.unlockCanvasAndPost(c); 
       } 
      } 

     } 
     super.run(); 
    } 

} 

ответ

2

В ThreadHelper.java изменения:

public class ThreadHelper extends Thread { 

к:

public class ThreadHelper implements Runnable { 

Тогда в тех местах, где вы создаете и начать ThreadHelper, изменить весь код, который выглядит более или менее, как это:

ThreadHelper threadHelper = new ThreadHelper(holder, puzzleSurface); 
threadHelper.start(); 

к этому:

ThreadHelper threadHelper = new ThreadHelper(holder, puzzleSurface); 
Thread thread = new Thread(threadHelper); 
thread.start(); 

Это должно сделать трюк!

+0

Позвольте мне попробовать. Кажется достаточно простым. 2 минуты. – portfoliobuilder

Смежные вопросы