我正在开发一个Xmpp聊天应用程序。
在我的PacketListener中,我正在尝试处理订阅请求,除了AlertDialog之外,它都像魅力一样。它没有出现,所以我无法得到用户的确认。
我试过了,
Toast.makeText()
getApplicationContext()
代替Display.this
但它们都不起作用。
正如我所说,我没有收到任何错误,我也尝试调试,似乎在代码方面工作。
这是我的代码,
//imports....
public class Display extends Activity {
//....more codes
private void addListener() {
//subscribe request handler
Roster roster = conn.getRoster();
roster.setSubscriptionMode(Roster.SubscriptionMode.manual);
PacketListener packetListener = new PacketListener() {
@Override
public void processPacket(Packet packet) {}
};
conn.addPacketListener(packetListener, new PacketFilter(){
@Override
public boolean accept(Packet packet) {
// TODO Auto-generated method stub
final Presence presence = (Presence)packet;
subscriptonAnswer = false;
if(packet instanceof Presence) {
if(((Presence)packet).getType().equals(Presence.Type.subscribe)) {
new AlertDialog.Builder(Display.this)
.setIcon(android.R.drawable.ic_dialog_alert)
.setTitle("Subscription Message")
.setMessage(StringUtils.parseName(packet.getFrom())+ " wants to add you, do you accept?")
.setPositiveButton("Yes", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which) {
Presence reply = new Presence(Presence.Type.subscribed);
reply.setTo(presence.getFrom());
conn.sendPacket(reply);
}
})
.setNegativeButton("No", null)
.show();
}
}
return true;
}});
}
//....more codes
}
答案 0 :(得分:0)
这是我第二次遇到同样的问题,但第一次有不同的结构,所以我第一次想不到它。
但@Robin's comment使我无法解决问题。
正如他所说我必须在UI线程上使用UI小部件,为了解决这个问题,我使用了Handler
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
//I'm free to manage UI Widgets here
}
};
//......
// I have to just sendmessage here
if(packet instanceof Presence) {
if(((Presence)packet).getType().equals(Presence.Type.subscribe)) {
handler.sendEmptyMessage(0);
}
}
//......