1

私はゲームを作成しています。誰かがクリックした後、ボールが画面上を移動しますが、これには時間がかかります。ボールが動かなくなった後にメソッドを実行しようとしています。私は睡眠を試みましたが、うまくいきませんでした。asynctask も調べましたが、完全には理解していません。誰かが私を正しい方向に向けたり、私のコードで asynctask を使用する方法を教えてくれたりできますか? 私はこれに本当に慣れていないので、何でも役に立ちます。

この最初の部分は、ゲーム内のアクションのコードを持つ Main クラスです。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 メソッドを再起動しなくなった後、何かを行う方法がわかりません。どんな助けでも役に立ちます、ありがとう!

4

1 に答える 1

4

AsyncTask にはgetメソッドがあり、プログラムは続行する前に AsyncTask からの出力を待機する必要があります。できることは、AsyncTask が完了したときに値を返すようにし、呼び出し元のスレッドでこの値を変数に割り当てることです。

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

ただし、get メソッドを使用すると、UI スレッドがブロックされます。より安全な (そしてより良い) 代替手段は、AsyncTask の onPostExecute メソッドを利用することです。これは doInBackground メソッドが完了した後に呼び出され、メイン UI スレッドで実行されます。

于 2013-07-23T22:32:13.850 に答える