2015-06-19 2 views
-1

У меня есть код, который случайно рисует красные круги. Это не сработало, пока я не приостановил и не возобновил методы в классах BOTH. Без методов паузы и возобновления экран будет просто черным и не изменяться. Зачем мне нужен метод и onResume и почему в обоих классах?Android - onPause и onResume

Прокомментированный код - это все методы паузы/возобновления.

public class RandomCircles extends Activity { 

    MySurfaceView mySurfaceView; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mySurfaceView = new MySurfaceView(this); 
     setContentView(mySurfaceView); 
    } 


/* @Override 
    protected void onResume() { 
     // TODO Auto-generated method stub 
     super.onResume(); 
     mySurfaceView.onResumeMySurfaceView(); 
    } 

    @Override 
    protected void onPause() { 
     // TODO Auto-generated method stub 
     super.onPause(); 
     mySurfaceView.onPauseMySurfaceView(); 
    }*/ 

    class MySurfaceView extends SurfaceView implements Runnable{ 

     Thread thread = null; 
     SurfaceHolder surfaceHolder; 
     volatile boolean running = false; 

     private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
     Random random; 

     public MySurfaceView(Context context) { 
      super(context); 
      // TODO Auto-generated constructor stub 
      surfaceHolder = getHolder(); 
      random = new Random(); 
     } 

     /*public void onResumeMySurfaceView(){ 
      running = true; 
      thread = new Thread(this); 
      thread.start(); 
     } 

     public void onPauseMySurfaceView(){ 
      boolean retry = true; 
      running = false; 
      while(retry){ 
       try { 
        thread.join(); 
        retry = false; 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }*/ 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      while(running){ 
       if(surfaceHolder.getSurface().isValid()){ 
        Canvas canvas = surfaceHolder.lockCanvas(); 
        //... actual drawing on canvas 

        int x = random.nextInt(getWidth()); 

        if(getWidth() - x < 100) 
         x -= 100; 
        else if(getWidth() - x > getWidth() - 100) 
         x += 100; 

        int y = random.nextInt(getHeight()); 

        if(getHeight() - y < 100) 
         y -= 100; 
        else if(getHeight() - x > getHeight() - 100) 
         y += 100; 

        int radius; 
        radius = 100; 
        Paint paint = new Paint(); 
        paint.setStyle(Paint.Style.FILL); 
        paint.setColor(Color.WHITE); 
        canvas.drawPaint(paint); 
        // Use Color.parseColor to define HTML colors 
        paint.setColor(Color.parseColor("#CD5C5C")); 
        canvas.drawCircle(x, y, radius, paint); 

        surfaceHolder.unlockCanvasAndPost(canvas); 
       } 
      } 
     } 

    } 
} 
+2

Сомневаюсь, что вам нужны оба. onResume имеет смысл. Это имеет смысл, поскольку в противном случае поток не запускается. Я полагаю, вы не пишете этот код? – njzk2

+0

Я не, но я пытаюсь понять, почему это работает – Sygnerical

+0

Итак, я начал добавлять/отбирать вещи, чтобы увидеть, что произойдет. – Sygnerical

ответ

1

Первые два onPause() и onResume() методы являются частью Activity жизненного цикла и вызываются, когда Activity приостановлена ​​/ возобновлена.

Это изображение иллюстрирует жизненный цикл Android Activity. Вы можете прочитать на нем HERE

enter image description here

Причину он работает с дополнительными onResume и методами в вашем Activity потому, что вы вызываете вашу SurfaceViewonPauseMySurfaceView() и onResumeMySurfaceView() методы из соответствующих методов в Activity. Если вы этого не сделали, ваши методы SurfaceView никогда бы не были вызваны и, таким образом, никогда не останавливали/не запускали поток.

+0

Но у меня нет методов onDestroy или onStop, они автоматические или не нужны? – Sygnerical

+0

Они реализованы в классе Activity, который вы расширяете. Вы только переопределяете их, если вам нужно их использовать. – Neil

+0

Что делают родительские функции для onResume и onPause? – Sygnerical

Смежные вопросы