在搜索有关此特定问题的更多信息后,我会尝试询问是否有人有解决方案..
我正在尝试开发一个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但它给出了相同的结果:当我点击时,点击有可能不起作用,并且它有可能工作
答案 0 :(得分:0)
我不确定没有剩下的代码,但是对话框没有显示可能是由this.wait(300);
引起的,因为冻结了屏幕。另外,如果要停止countDown线程,请使用countdownThread.interrupt();
并确保在catch (InterruptedException e) {
块中包含任何重要操作。
最后,我不知道循环的其余部分是什么样的,但看起来好像你是在每次迭代你的while循环时创建一个新线程,如果是这样的话 - 可能就是为什么线程不是'可预测的。