我有以下代码,基本上我每10秒从Web服务获取一次数据,并在警报对话框和通知中显示每次获取的内容。问题是如果警报没有从上一个周期关闭并且仍然在页面上,我怎么不弹出警报,因此在用户必须关闭的同时不会打开2个或更多相同的警报。
public class myActivity extends Activity {
public class getActiveAlerts extends Thread {
public void run() {
while (true)
{
try {
.... code to get data from web service .....
即使当AlertDialog存在且未触摸时,即使旧警报仍然存在,即使旧警报仍然存在,“alert.isShowing”仍然显示为false,它会创建一个具有相同警报的新警报属性每10秒。 (我会想到如果警报被打开,alert.isShowing会显示真实并且不会创建新的警报。我在这里做错了什么或者有更好的方法吗?
最后,我不相信有一种方法可以检测通知当前是否处于活动/显示状态,而不是点击关闭。当线程在10秒后被调用再次启动时,是否有标准方法检查通知是否“正在显示”,因此通知不会每10秒创建一次?
String root = doc.getDocumentElement().getNodeName();
//lets set alert title and msg to whatever "root" is for now, root contains the data I get from my web service.
myActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
AlertDialog.Builder alertBuild = new AlertDialog.Builder(myActivity.this);
alertBuild.setMessage(root)
.setCancelable(false)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
}
});
AlertDialog alert = alertBuild.create();
if(alert.isShowing())
{
Log.v("alert", "isShowing==true");
}
else {
Log.v("alert", "isShowing==false");
alert.setTitle(root);
alert.setIcon(R.drawable.ic_launcher);
alert.show();
}
}
});
displayNotification(root, root);
}
}
}
}catch (SAXParseException err) {
Log.v(" " , err.getMessage ());
}catch (SAXException e) {
Exception x = e.getException ();
((x == null) ? e : x).printStackTrace ();
}catch (Throwable t) {
t.printStackTrace ();
}
try {
Thread.sleep(10000); // sleeps for 10 seconds then runs myActivity again
} catch (InterruptedException e) {
e.printStackTrace();
}
}// close while loop
}
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
getActiveAlerts thread = new getActiveAlerts();
thread.start();
}
public void displayNotification(String msg, String desMsg)
{
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new Notification(R.drawable.ic_launcher, msg + "\n" + desMsg, System.currentTimeMillis());
PendingIntent contentIntent = PendingIntent.getActivity(this, 1, new Intent(this, myActivity.class), 0);
notification.setLatestEventInfo(this, "new alert", "", contentIntent);
manager.notify(1, notification);
}
答案 0 :(得分:2)
您每次都在创建一个全新的AlertDialog对象。由于您刚刚创建了它,并且没有在该特定对象上调用show,因此该特定对象的isShowing为false。任何以前创建的对话框可能会显示也可能不会显示,但您不会询问这些对象。
您可以通过在runnable中使用您要发布的结果调用活动上的方法来解决此问题,而不是在runnable中进行发布。这将使活动跟踪当前显示的对话框,如果已经可见,则不创建新对话框。
请注意,如果您的帖子的生命长于活动的生命,那么在后台线程中引用您的活动可能会造成巨大的内存泄漏。考虑将弱refence存储到线程中的侦听器,而不是对您的活动的硬引用。
答案 1 :(得分:1)
看起来你在创建一个新的AlertDialog对象后调用alert.isShowing(),该对象在调用alert.show()之前将为false。