Ненормальное поведение runnable, выйдя из активности и, которое должно вновь инициализировать ее

Последуй, что в одной Activity я использую один grid изображений, питаемый одним Adapter, что освежает спасибо один Runnable который я выполняю периодически, и это всегда тот же самый (ej: 500 миллисекунд) и я это не изменяю ни в каком сайте кода.

sobreescrito метод onBackPressed, потому что я нуждаюсь в том, чтобы сохранять, закончив активность и закрываю Activity с одним finish() и я инициализирую предыдущую активность, начиная с которой я начался.

Проблема, которая у меня есть, - что, если я вновь инициализирую ту же активность, timer прекрати вести себя соответствующим образом и вместо того, чтобы работают каждые X миллисекунд, которые я показываю ему, работает, когда он нравится ему, что обычно является менее чем X миллисекундами и не постоянное количество. Так что мой grid не освежает соответствующим образом изображения.

Он произошел с кем-то немного сходно?

Активность, которую содержит grid, я считаю осуществленной так...

    public class PantallaTragaperrasBotonera extends FragmentActivity {
        private Tragaperras juegoTragaperras;
        private GridView gridview;
        private ImageAdapter imageadapter;              
        public byte estado;

        //se le pasa como parámetro al INTENT
        private int numEjecuciones;

        //los tres primeros y el Ya normal para el resto.

        private Runnable swapImages = new Runnable(){
            public void run(){
                Log.d("DEBUGUEANDO", "PantallaTragaperrasBotonera: INICIO private Runnable swapImages = new Runnable(){ public void run(){);");

                //Si no se han pulsado los tres botones         
                if (!juegoTragaperras.finalizado() && !contador.tiempoFinalizado()){
                        Log.d("DEBUGEANDO","if (!juegoTragaperras.finalizado() && !contador.tiempoFinalizado()){");
                        mostrarImagenes(this);                      
                        juegoTragaperras.incrementarPosicionesMomentosParo();

                }else{
                    Log.d("DEBUGUEANDO","PantallaTragaperrasBotonera: }else{");
                    //Se muestra el cuadro de diálogo con la puntuación obtenida
                    if (estado == 0){

                        estado = 1;
                        gridview.postDelayed(swapImages, 0);

                    //Se muestra el grid con las animaciones pertinentes y la animación del contador
                    }else if (estado ==1){
                        gridview.postDelayed(swapImages,0);
                    }else if (estado == 2){                     
                        imageadapter.notifyDataSetChanged();                            
                        gridview.setAdapter(imageadapter);
                        gridview.invalidateViews();
                        gridview.postDelayed(swapImages, (Tragaperras.ganado() ? 5000:1000));                       
                        estado = 3;
                    //finalmente se finaliza la actividad
                    }else if (estado == 3){                     
                        try{

                            Intent i = new Intent(PantallaTragaperrasBotonera.this, PantallaObjetivo.class);
                            i.putExtra("com.example.HappyBoom.PUNTOS_CONTADOR", contador.obtenerPuntuacionContador());
                            PantallaTragaperrasBotonera.this.startActivity(i);

                            finish();
                            Runtime.getRuntime().gc();
                        }catch(Exception e){}               
                    }               
                }               
            }

        };

        //para manejar el evento OnTimerListener    
        @Override
        protected void onCreate(Bundle savedInstanceState) {        

            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);          
            setContentView(R.layout.activity_tragaperrasbotonera);

            //Obtenemos las variables entre actividades         
            Bundle extra = this.getIntent().getExtras();
            puntosContador = extra.getLong("com.example.HappyBoom.PUNTOS_CONTADOR");
            numEjecuciones = extra.getInt("com.example.HappyBoom.NUMERO_EJECUCIONES");
            numEjecuciones = 1;

            juegoTragaperras = Tragaperras.getInstance();
            juegoTragaperras.reiniciarInstancia();

            gridview = (GridView) findViewById(R.id.gvTragaperras);         
            gridview.setNumColumns(juegoTragaperras.getNumeroColumnas());
            imageadapter = new ImageAdapter(this, ImageAdapter.TipoJuego.TRAGAPERRAS);
            gridview.setAdapter(imageadapter);                              
            gridview.postDelayed(swapImages, 0);
            //...
        }

        @Override
        public void onBackPressed() {           
            guardarDatos();
            Intent i = new Intent(this, SeleccionaJuegos.class);
            if (i != null)this.startActivity(i);
            finish();
            Runtime.getRuntime().gc();      
        }

        private void guardarDatos(){
            //guarda los datos
        }       

        /**
         * Muestra las imágenes dependiendo del array de estados que el juego haya alcanzado.
         * @param runnable
         */     
        private void mostrarImagenes(Runnable runnable){
            imageadapter.notifyDataSetChanged();                
            gridview.setAdapter(imageadapter);
            gridview.invalidateViews();
            gridview.postDelayed(swapImages, Tragaperras.intervaloMuestraImagen);       
        }
}
1
задан 17.03.2016, 21:56
4 ответа

Проблема, которая у тебя есть, состоит, в том, что сделав onBackPressed, () ты не останавливаешь трэд, который у тебя есть в выполнении, следовательно, когда ты инициализируешь снова активность, начинается снова вышеупомянутый трэд, поэтому случается, что он медлит меньше времени с тем, чтобы освежать изображения. Я рекомендую тебе использовать интерфейс ScheduledExecutorService и Future, здесь пример:

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
Future<?> future = scheduler.scheduleAtFixedRate(runnable, INITIAL_DELAY, INTERVAL, TimeUnit.SECONDS)

В твоем случае это осталось бы так:

Future<?> future = scheduler.scheduleAtFixedRate(swapImages, 0, 5, TimeUnit.SECONDS)

В конце концов отменять для это ты должен использовать свойство future.cancel (), что я рекомендую использовать тебя в жизненных циклах вместо в onBackPressed ():

@Override
public void onDestroy() {
    super.onDestroy();
    if (future != null && !future.isCancelled()) future.cancel(true);
}

Это совсем, я надеюсь, что он помогает тебе. Приветствие.

1
ответ дан 24.11.2019, 14:43
  • 1
    Большое спасибо. Уже я это решил, звоня в onBackPressed в м и # 233; каждый removeCallbacks. – Lirulis 19.03.2016, 03:56

Благодаря всем из-за ваших вкладов, но уже я это решил. Просто serГ - в aГ±adir в mГ©todo onBackPressed следующая lГ-nea:

gridview.removeCallbacks(swapImages); 
1
ответ дан 24.11.2019, 14:43
  • 1
    Сделай это лучше, как они комментируют тебе в onDestroy () – Webserveis 17.06.2016, 12:56

Попробуй делать это используя Handler:

handler.postDelayed(new Thread(new Runnable(){
                        public void run(){
                            //Aqui el contenido del hilo
                        }
                    }).start(), 500);

Главным образом это, что он делает, состоит в том, чтобы выполнять трэд, проведенный время, в этом случае 500 м и выполнил бы блок кода, что есть, где он помещает комментарий, в твоем случае обновлять вид.

Имей в виду, что ты не можешь менять вещи вида с трэдов, которые были бы вне активности. Ты должен изловчаться они, чтобы это делать или использовать автобус событий. Есть много info на этом в google.

Удачи!

0
ответ дан 24.11.2019, 14:43
  • 1
    Я переслал часть меня c и # 243; я говорю в моем сомнении. runnable, который я использую est и # 225; внутри самой активности, которую я закрываю, и invocaci и # 243; n, которого я делаю timer, я делаю ее в неотрицательном приращении и # 225; ndoselo в postDelayed самого grid. и #191; Это это неправильное? – Lirulis 17.03.2016, 15:51
  • 2
    Конечно проблема состоит в том, что ты не можешь изменять вид с трэда, который не был бы трэдом ejecuci и # 243; n главный aplicaci и # 243; n. Это com и # 250; n в почти всех интерфейсах грамм и # 225; ficas. WPF, IOS, Android, JAVAFX И Т.Д.... Он очень com и # 250; n использовать Автобус событий, что b и # 225; sicamente то, что он делает, состоит в том, чтобы выполнять изменение в моменте главного трэда. Но также есть м и # 225; s способы делать изменения, не используя Автобуса. – Alvaro Royo 18.03.2016, 11:26

выполнил периодически, и это всегда тот же самый (ej: 500 миллисекунд) и не это varГ - или в ningГєn я осаждаю cГіdigo.

я Могу комментировать тебе то, что в действительности, изменяет ли он время и зависит от состояния переменной Tragaperras.ganado():

        }else if (estado == 2){
            imageadapter.notifyDataSetChanged();
            gridview.setAdapter(imageadapter);
            gridview.invalidateViews();
            gridview.postDelayed(swapImages, (Tragaperras.ganado() ? 5000:1000));
            estado = 3;

, Если Tragaperras.ganado() истинный, будет delay 5 секунд (5000ms), если Tragaperras.ganado() фальшивый, будет delay 1 секунды (1000ms)

, Если ты хочешь, чтобы он не изменил время, у тебя должна быть установленная стоимость, например, если ты желаешь поздно 1 секунду всегда:

 gridview.postDelayed(swapImages, (1000));
0
ответ дан 24.11.2019, 14:43
  • 1
    Имей и # 237; в который конкретизировать, что моего сомнения - для состояния 1. – Lirulis 17.03.2016, 23:53
  • 2
    Давайте говорить, что в состоянии 1 est и # 225; n показывая im и # 225; гены и refresc и # 225; ndolas каждые 500 миллисекунд. Если пользователь не interact и # 250; в с aplicaci и # 243; n быть должным и # 237; an освежения grid как торговый автомат, вещь, которая делает правильно, до тех пор, пока, если я нажимаю bot и # 243; n atr и # 225; s и он работает onBackPressed. В этом м и # 233; совсем, сохраняй и инициализируй предварительную активность в и #233; sta. С новой активности, которая открывается, вновь наставляют активность PantallaTragaperrasBotonera в состоянии 1 и aqu и # 237; он где уже не est и # 225; n освежая хорошо im и # 225; гены. – Lirulis 17.03.2016, 23:57
  • 3
    @Lirulis, если состояние 1 имеет, и #250; nicamente gridview.postDelayed (swapImages, 0); ты отложил и проверил действительно он имеет " estado" стоимость 1? – Jorgesys♦ 18.03.2016, 00:03
  • 4
    Извини, но это не в состоянии 1, где освежается grid а в первом if. И est и # 225; бывший доказано, что он вводит и освежает im и # 225; гены. Logue и # 233; все поведение, чтобы видеть, что выполнят правильно ее l и # 243; gica дела и он пошел где я percat и # 233; что то, что он перемещал, состояло в том, что runnable не работал в интервале 500 миллисекунд, которые имей, и # 237; в установленный, а каждое все, что давало ему желание и не установленное количество. Podr и # 237; чтобы изменять в 100, 200, 400, 300, 100, 500... миллисекунды... – Lirulis 18.03.2016, 00:49
  • 5
    большое спасибо из-за твоего aportaci и # 243; n. Он был решен removeCallBacks в м и # 233; каждый onBackPressed. – Lirulis 19.03.2016, 03:51

Теги

Похожие вопросы