Я нашел несколько примеров кода для создания головоломки, и я заметил, что у них есть класс 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 минуты. – portfoliobuilder