2013-03-22 7 views
0

이 클래스는 onCreate() 메서드에서 발생하도록 요청하고 클래스의 맨 아래에는 모두 완료되면 true로 설정되는 부울 값이 있습니다. 그래야만 내 SurfaceView가 필요한 것을 그려 낼 것입니다. 왜이 세 가지 수업이 끝나기까지 오래 걸리나요?완료하는 데 오랜 시간이 걸리는 AsyncTasks

적, 클라우드, & 총알은 내가 자신의 클래스를 호출하기 전에로드 모든 비트 맵이다

public class handleBullets extends AsyncTask<String, Integer, String> 
    { 
     @Override 
     protected String doInBackground(String... arg0) { 
      Random r = new Random(); 
      Log.d(null, "Spawn E-Bulles"); 
      for(int i = 0; i < enemies.size(); i++) 
      { 
       Enemy tempE = enemies.get(i); 
       if(System.currentTimeMillis() - tempE.lastBulletSpawn >= 800 && tempE.x <= SCREEN_WIDTH) 
       { 
        EnemyBullet eb = new EnemyBullet(tempE.x, tempE.y, enemyBullet.getWidth(), enemyBullet.getHeight(), enemy.getWidth(), enemy.getHeight()); 
        enemyBullets.add(eb); 

        tempE.lastBulletSpawn = System.currentTimeMillis(); 
       } 
      } 
      Log.d(null, "Spawn Bullets"); 
      if(System.currentTimeMillis() - lastPBSpawn >= 400) 
      { 
       Bullet b = new Bullet(x, y, player.getWidth(), player.getHeight()); 
       bullets.add(b); 

       lastPBSpawn = System.currentTimeMillis(); 
      } 
      Log.d(null, "Remove Bullets"); 
      for(int i = bullets.size() - 1; i > -1; i--) 
      { 
       Bullet tempB = bullets.get(i); 
       if(tempB.x >= SCREEN_WIDTH) 
        bullets.remove(i); 
      } 
      Log.d(null, "removeEnemy Bullets"); 
      for(int i = enemyBullets.size() - 1; i > -1; i--) 
      { 
       EnemyBullet tempEB = enemyBullets.get(i); 
       if(tempEB.x <= 0 - enemyBullet.getWidth()) 
        enemyBullets.remove(i); 
      } 
      Log.d(null, "Explosion Renders"); 
      for(int i = explosions.size() - 1; i > -1; i--) 
      { 
       Explosion tempEx = explosions.get(i); 
       tempEx.update(); 
       if(tempEx.duration <= 0) 
        explosions.remove(i); 
      } 
      initial_bullets = true; 
      return null; 
     } 
    } 
    public class handleEnemy extends AsyncTask<String, Integer, String> 
    { 
     @Override 
     protected String doInBackground(String... arg0) { 
      Log.d(null, "Spawning Enemies..."); 
      if(System.currentTimeMillis() - lastESpawn >= 750 && enemy != null) 
      { 
       Enemy x = new Enemy(SCREEN_WIDTH, SCREEN_HEIGHT, enemy.getWidth(), enemy.getHeight()); 
       enemies.add(x); 

       lastESpawn = System.currentTimeMillis(); 
      } 
      Log.d(null, "Enemies Spawned"); 
      // 
      Log.d(null, "Removing Enemies..."); 
      for(int i = enemies.size() - 1; i > -1; i--) 
      { 
       Enemy tempE = enemies.get(i); 
       if(tempE.x <= 0 - enemy.getWidth()) 
        enemies.remove(tempE); 
      } 
      Log.d(null, "Enemies Removed"); 
      // 
      initial_enemies = true; 
      return null; 
     } 
    } 
    public class handleClouds extends AsyncTask<String, Integer, String> 
    { 
     @Override 
     protected String doInBackground(String... arg0) { 
      Log.d(null, "Generating Clouds..."); 
      Random r = new Random(); 
      if(r.nextInt(200) == 0 && clouds.size() <= 6 && cloudBM1 != null && cloudBM2 != null) 
      { 
       Cloud c = new Cloud(SCREEN_WIDTH, SCREEN_HEIGHT, cloudBM1.getWidth(), cloudBM2.getHeight()); 
       clouds.add(c); 
      } 
      Log.d(null, "Clouds Generated"); 
      // 
      Log.d(null, "Removing Clouds..."); 
      for(int i = clouds.size() - 1; i > -1; i--) 
      { 
       Cloud tempC = clouds.get(i); 
       if(tempC.x <= 0 - cloudBM1.getWidth() && tempC.dir == 0) 
        clouds.remove(i); 
       if(tempC.x >= SCREEN_WIDTH && tempC.dir == 1) 
        clouds.remove(i); 
      } 
      Log.d(null, "Clouds Removed"); 
      // 
      initial_clouds = true; 
      return null; 
     } 
    } 
+0

http://developer.android.com/reference/android/os/AsyncTask.html 확인 실행 순서 – Raghunandan

+0

작업이 실제로 완료되는 데 오랜 시간이 걸리거나 작업 (또는 SurfaceView)이 완료되었음을 인식하지 못합니까? –

+0

Raghunandan - 그게 무슨 소리 야? 나도 그걸 두려워하지 말라고 했니? Ted Hopp - if (initial_clouds && ...)와 같은 부울 값을 검사하는 SurfaceView가 있습니다. – Josh

답변

0

당신의 작업은 시리얼을 실행하는 것이 될 수 있습니다. execute() 대신 executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)을 사용하여 작업을 병렬로 실행 해보십시오.

+0

2.3.3 이상에서 작동하려면 응용 프로그램이 필요합니다. – Josh

관련 문제