Android-线程,侦听器和倒数计时存在问题

问题描述

| 搜索有关此特定问题的更多信息后,我尝试在此处询问是否有人提供了解决方案。 我正在尝试开发一个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);
        }
    });
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);

                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\",int id) {
                        dialog.cancel();
                    }
                });

                loginAlert.show();

                break;
            case 5 :
                stopCountDown();
                break;
            }
        }
    };
刚开始时,我只使用线程和处理程序,但是由于错误的结果,我尝试了AsyncTask,但给出了相同的结果:单击时,单击不起作用的可能性也很大。     

解决方法

        我不确定是否没有其余代码,但对话框未显示可能是由于ѭ4所致,因为这会冻结屏幕。另外,如果要停止countDown线程,请使用
countdownThread.interrupt();
,并确保在
catch (InterruptedException e) {
块中包含所有重要操作。 最后,我不知道该循环的其余部分是什么样子,但看起来好像您在while循环的每个迭代中都在创建一个新线程,如果是这样的话,这可能是线程不可预测的原因。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...