2013-07-23 35 views
1

我正在做一个游戏,并在有人点击后,球移动屏幕上,这需要一些时间。我试图在球停止移动后做一个方法。我尝试了睡眠,并没有奏效。我也看着asynctask,并没有完全理解它。有人能指引我正确的方向或告诉我如何使用asynctask与我的代码,谢谢。我真的很陌生,所以任何事情都会有帮助。我需要帮助开始一种方法后,另一种方法完成后,而不是在它

第一部分是主类,其中包含游戏中的动作代码。 afterKick()方法是kick()方法完成后我想要发生的操作。

final FrameLayout main = (FrameLayout) findViewById(R.id.main_view); 
    main.setBackground(this.getResources().getDrawable(R.drawable.field)); 
    newBall = new Ball(this); 
    main.addView(newBall); 
     main.setOnTouchListener(new View.OnTouchListener() { 
      public boolean onTouch(View v, MotionEvent event) { 

       float x = event.getX(); 
       float y = event.getY(); 
       System.out.println("x:" + x + " y" + y); 

       if(kick == false && attempt<10) 
       { 
        setHeight(y, newBall); 
        kick(x,y,newBall,main); 
       } 
       afterKick(); 
       // TODO Auto-generated method stub 
       return false; 
      } 
     }); 

一旦kick()方法被调用,它会转到创建球的类。 onDraw方法不断重复,直到球因无效而不再重绘。

@Override 
protected void onDraw(Canvas canvas){ 
    super.onDraw(canvas); 
    canvas.drawBitmap(scaled, left, top, null); 
    if(topMax>=top) 
    { 
     setDone(true); 
    } 
    else if(straight == true && top> topMax) 
    { 
     kickStraight(); 
    } 
    else if(righty == true && top>topMax) 
    { 
     kickRight(); 
    } 
    else if(midRight == true && top>topMax) 
    { 
     kickMidRight(); 
    } 
    else if(midLeft == true && top>topMax) 
    { 
     kickMidLeft(); 
    } 
    else if(lefty == true && top>topMax) 
    { 
     kickLeft(); 
    } 
    invalidate(); 
} 

我无法弄清楚无效后如何做某些事情不再重新启动onDraw方法。任何帮助将是有用的,谢谢!

+0

你能发现球何时停止吗? –

+0

我有一个最大高度取决于你点击球的位置,然后onDraw方法会通过并且每次向上移动一组数字,直到达到最大高度。总之,是的。 – theCJCsoccer

回答

3

AsyncTasks有一个get方法,它会强制程序在继续之前等待来自AsyncTask的输出。你可以做的是让你的AsyncTask在完成时返回一个值,在你的调用线程中你可以把这个值赋给一个变量。

AsyncTask task = new AsyncTask().execute(params); 
Object output = task.get(); 

但是,使用get方法会阻塞UI线程。更安全(更好)的选择是使用AsyncTask的onPostExecute方法。这将在doInBackground方法完成后调用,并将在主UI线程上运行。

+0

两个简单的问题,它们可能有点新鲜:我需要为asyncTask创建一个新类,还是可以将它包含在我拥有的主类或球类中?以及我如何将方法放入每个都有多个参数的asyncTask?我试图尽可能地理解。如果你能帮助我更多的感谢。 – theCJCsoccer

+0

是的,你需要创建一个新类来扩展AsyncTask 。 AsyncTask的doInBackground方法使用可变参数,因此您可以根据需要将多个参数传递给该方法。这里有一个很棒的AsyncTask教程http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html#concurrency_asynchtask。 – ashwin153

+0

我终于能够理解asyncTask足以让它工作。但同样的问题发生在这个,虽然因为我不认为onDraw方法被视为doInBackGround中的方法的一部分。但是我可以在异步时使用睡眠,而无需使用onDraw方法完全停止,就像我在我的主类中尝试睡眠时一样。感谢所有的提示! – theCJCsoccer

相关问题