This is where the thread variable is declared. private Context mContext; /** The thread that actually draws teh animations. */ private CupThread thread; private TextView mStatusText;
public CupView(Context context, AttributeSet attrs){ super(context,attrs); //register our interest in hearing about changes to our surface SurfaceHolder holder = getHolder(); holder.addCallback(this); mContext = context; setFocusable(true); // create thread only; it's started in surfaceCreated() } I'm sorry for the confusion about "exiting" in rollDice(). Indeed, I am not exiting here, but starting another Activity. I believe, as you mentioned, this is a case where the original activity is still there, and then being re-displayed. However, CupView's surfaceDestroyed() is called when I start the other Activity in rollDice(). This means that when the Activity holding CupView resumes I should be able to create a new thread and start it. I am aware you can't call start() on the same thread twice, but since surfaceDestroyed() is called that thread is terminated with the .join () call. A new thread is then created and started in surfaceCreated(). I will post the full code to both the Activity holding the CupView, as well as the CupView in the following post. On Mar 31, 10:17 pm, Dianne Hackborn <hack...@android.com> wrote: > I don't think you've included enough code. Where is this 'thread' variable > defined? Where do you clear it after finishing the thread? > > I am also confused by the comment saying you "exiting" the activity in > rollDice -- you aren't calling finish, you are just starting another > activity, so the original activity is still there, and its window will just > be re-displayed when it is shown again. > > The only thing I can think of is that you aren't handling the case where > your window is hidden and then shown again, causing surfaceCreated to be > called a second time on the same SurfaceView, but again there isn't enough > code here to really tell what is happening. > > Also you do know that you can only call Thread.start() once on a particular > thread object, right? > > http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.html#start() > > > > On Tue, Mar 31, 2009 at 6:46 PM, kbeal10 <kbea...@gmail.com> wrote: > > > I'm writing a game using two different SurfaceView's (RollView and > > CupView) in two different activities. Both SurfaceView's heavily > > resemble the LunarLander demo. > > > The RollView SurfaceView is working fine. When leaving the Activity, > > RollView's surfaceDestroyed() is called, killing the thread. If I then > > re-enter that Activity, the thread is recreated in RollView's > > constructor and then started in surfaceCreated(). > > > However in CupView the thread never seems to go away. SurfaceDestroyed > > is being called, but upon reentering the Activity I get the following > > error: > > > java.lang.IllegalThreadStateException: Thread already started. > > > This thrown is in surfaceCreated() at the thread.start() call. > > > The difference between the two, and apparently the problem, is that in > > the RollView Activity I call finish() when done. When leaving the > > CupView Activity, I'm doing a startActivityForResult > > (i,ClassWithRollView.class);......not calling finish(). > > > This is because after leaving the RollView, I want to return to the > > CupView. Below is relevant code: > > > /** This where I'm exiting the Activity with the CupView **/ > > private void rollDice(){ > > if (mMode==IN_PROGRESS){ > > // create a new intent for the roll dice view > > Intent i = new Intent(this,RollDice.class); > > mRollCount = mRollCount + 1; > > if (mRollCount == 3){ > > mTurnCount += 1; > > } > > if (mTurnCount == 13){ > > setState(GAME_OVER); > > } > > i.putExtra("my.package.RollCount", mRollCount); > > i.putExtra("my.package.GameID",mGameID); > > startActivityForResult(i,ROLL_DICE_ACTIVITY); > > } > > } > > > /** This is CupView's surfaceCreated/Destroyed **/ > > > //------------------------------------------------------------------------- > > -------------------- > > /* Callback invoked when the Surface has been created and is read to > > be used. */ > > public void surfaceCreated(SurfaceHolder holder){ > > // start the thread here so that we don't busy-wait in run() > > // waiting for the surface to be created > > Log.d("MyApp","cup view surface created"); > > thread.setRunning(true); > > thread.start(); > > } > > > //------------------------------------------------------------------------- > > -------------------- > > /* Callback invoked when the Surface has been destroyed and must no > > longer be touched. > > * WARNING: after this method returns, the Surface/Canvas must never > > be touched again! > > * (Unless its REALLY asking for it.) > > */ > > public void surfaceDestroyed(SurfaceHolder holder){ > > // we have to tell thread to shut down & wait for it to > > finish, or > > else it might touch > > // the Surface(wouldn't want that!) after we return and > > explode > > (ahhh!). > > Log.d("MyApp","cup view surface destroyed"); > > boolean retry = true; > > thread.setRunning(false); > > while (retry){ > > try{ > > thread.join(); > > retry = false; > > }catch(InterruptedException e){ > > > } > > } > > } > > > So why is the thread saying its already started when surfaceDestroyed > > () has been called? > > > A possible workaround is to call finish() on the CupView Activity in > > the rollDice() method above. This doesn't seem to follow common > > paradigm though. Any other solutions, comments? All help is > > appreciated. > > -- > Dianne Hackborn > Android framework engineer > hack...@android.com > > Note: please don't send private questions to me, as I don't have time to > provide private support. All such questions should be posted on public > forums, where I and others can see and answer them. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers-unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en -~----------~----~----~----~------~----~------~--~---