Android — onPause и onResume

У меня есть код, который случайным образом рисует красные круги. Это не сработало, пока у меня не было методов паузы и возобновления в ОБОИХ классах. Без методов паузы и возобновления экран был бы просто черным и не менялся бы. Зачем мне понадобился метод 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);
                }
            }
        }

    }
}

person Sygnerical    schedule 19.06.2015    source источник
comment
Сомневаюсь, что вам нужны оба. Однако onResume имеет смысл. Это имеет смысл, так как иначе ваш поток не запустится. Я полагаю, вы не написали этот код?   -  person njzk2    schedule 19.06.2015
comment
Я не делал, но пытаюсь понять, почему это работает   -  person Sygnerical    schedule 19.06.2015
comment
Поэтому я начал добавлять/удалять вещи, чтобы посмотреть, что произойдет.   -  person Sygnerical    schedule 19.06.2015
comment
ваше представление поверхности реализует Runnable. для запуска метода run вам нужно либо вызвать его, либо Thread сделать это за вас. Если вы удалите поток, который находится в onResumeMySurfaceView, он больше ничего не сделает...   -  person njzk2    schedule 19.06.2015
comment
Итак, onResume вызывает onResumeMySurfaceView, который запускает поток, вызывающий метод запуска?   -  person Sygnerical    schedule 19.06.2015
comment
да, это то, что делают потоки. docs.oracle.com/javase/7/docs/ API/java/lang/Thread.html   -  person njzk2    schedule 19.06.2015
comment
Хорошо, это помогает, спасибо   -  person Sygnerical    schedule 19.06.2015


Ответы (1)


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

На этом изображении показан жизненный цикл Android Activity. Вы можете прочитать об этом ЗДЕСЬ

введите здесь описание изображения

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

person the-ginger-geek    schedule 19.06.2015
comment
Но у меня нет методов onDestroy или onStop, они автоматические или не нужны? - person Sygnerical; 19.06.2015
comment
Они реализованы в классе Activity, который вы расширяете. Вы переопределяете их только в том случае, если вам нужно их использовать - person the-ginger-geek; 19.06.2015
comment
Что делают родительские функции для onResume и onPause? - person Sygnerical; 19.06.2015
comment
Они делают определенные действия, о которых вам не нужно беспокоиться. Все, что вам нужно помнить при их переопределении, это вызывать super.onResume(); или super.onPause(); чтобы методы Activity все еще выполнялись - person the-ginger-geek; 19.06.2015