2013-07-23 37 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

相關問題