问题描述
|
搜索有关此特定问题的更多信息后,我尝试在此处询问是否有人提供了解决方案。
我正在尝试开发一个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循环的每个迭代中都在创建一个新线程,如果是这样的话,这可能是线程不可预测的原因。