Android - проблема с темой, слушателем и обратным отсчетом - PullRequest
0 голосов
/ 30 мая 2011

После поиска дополнительной информации об этой конкретной проблеме, я пытаюсь спросить здесь, есть ли у кого-то решение ..

Я пытаюсь разработать приложение для Android, в котором некоторые события отображаются в виде списка с таймером обратного отсчета между сегодняшним днем ​​и датой события.

Я добавил «onItemClickListener» в просмотр списка, чтобы спросить пользователя, хочет ли он добавить событие в свой список.

Это код обратного отсчета:

while (countdownActive) {                   
    countdownThread = new Thread(new Runnable() {

        @Override
    public synchronized void run() {
    try {
        this.wait(300);
        handler.sendEmptyMessage(3);
    } catch (InterruptedException e) {
            Log.d("CKUne", e.getMessage());
    }
    }
});

countdownThread.start();

Проблема в том, что когда я нажимаю на элемент, диалоговое окно не всегда отображается. Иногда это происходит (вероятно, потому что основной поток имеет фокус), а иногда нет (когда поток countDown имеет фокус).

Надеюсь, у вас есть решение, чтобы остановить поток от другого.

Спасибо

@ Geo: это механизм для диалогового окна:

eventsListView.setOnItemClickListener (new OnItemClickListener () {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, final int position,
                long id) {
            ckPosition = position;

            new addCKTask().execute(null , null , null);
        }
    });

Задача addCK:

private class addCKTask extends AsyncTask<URL, Integer, Long> {

        @Override
        protected Long doInBackground(URL... params) {
            Log.d("CKUne" , "itemclick");
            handler.sendEmptyMessage(5);

            handler.sendEmptyMessage(4);

            handler.sendEmptyMessage(2);

            return null;
        }   
    }

затем обработчик:

private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            switch(msg.what) {
            case 1 :
                findViewById(R.id.loadCategoriesProgress).setVisibility(View.VISIBLE);
                title.setText(categoriesName[indexCategorie].getLibelleCategorie());
                break;
            case 2 :
                eventsListView.setAdapter(adapter);

                countdownActive = true;

                cdTask = new startCountDown();
                cdTask.execute(null, null, null);

                findViewById(R.id.loadCategoriesProgress).setVisibility(View.INVISIBLE);
                break;
            case 3 :
                Thread.currentThread().interrupt();

                adapter.notifyDataSetChanged();
                break;
            case 4 :
                countdownThread.interrupt();

                stopCountDown();

                AlertDialog.Builder loginAlert = new AlertDialog.Builder(CKALaUne.this);

                loginAlert.setMessage("Voulez-vous ajouter " + events.get(ckPosition).getNomCK() + "à votre liste ?");

                loginAlert.setPositiveButton("Ajouter", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        chronokifWebServices.AddToMyChronokifs(CKALaUne.this.getIntent().getExtras().getString("pseudonyme"), CKALaUne.this.getIntent().getExtras().getString("password"), (events.get(ckPosition).getIdCK() + ""));
                    }
                });

                loginAlert.setNegativeButton("Annuler", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        dialog.cancel();
                    }
                });

                loginAlert.show();

                break;
            case 5 :
                stopCountDown();
                break;
            }
        }
    };

В начале я использовал только поток и обработчик, но из-за неправильного результата я попробовал AsyncTask, но он дает тот же результат: когда я нажимаю, есть шанс, что щелчок не работает, и шанс, что он работает .

1 Ответ

0 голосов
/ 30 мая 2011

Я не уверен без остальной части кода, но диалоговое окно не отображается, возможно, из-за this.wait(300);, так как это останавливает экран. Кроме того, если вы хотите остановить поток countDown, используйте countdownThread.interrupt(); и обязательно включите все важные действия в блок catch (InterruptedException e) {.

Наконец, я не знаю, как выглядит остальная часть цикла, но похоже, что вы создаете новый поток на каждой итерации цикла while, что, если бы это было так, могло быть причиной того, что поток не существует. т предсказуемо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...