Android - 线程,监听器和倒计时问题

时间:2011-05-30 11:10:35

标签: java android multithreading listener

在搜索有关此特定问题的更多信息后,我会尝试询问是否有人有解决方案..

我正在尝试开发一个Android应用程序,它在列表视图中显示一些事件,在今天和事件的日期之间有一个倒数计时器。

我在listview上放了一个“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);
        }
    });

addCKTask:

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 :(得分:0)

我不确定没有剩下的代码,但是对话框没有显示可能是由this.wait(300);引起的,因为冻结了屏幕。另外,如果要停止countDown线程,请使用countdownThread.interrupt();并确保在catch (InterruptedException e) {块中包含任何重要操作。

最后,我不知道循环的其余部分是什么样的,但看起来好像你是在每次迭代你的while循环时创建一个新线程,如果是这样的话 - 可能就是为什么线程不是'可预测的。