在消息处理程序中使用AlertDialog

时间:2013-01-19 23:51:47

标签: android xmpp handler android-alertdialog asmack

我正在开发一个Xmpp聊天应用程序。

在我的PacketListener中,我正在尝试处理订阅请求,除了AlertDialog之外,它都像魅力一样。它没有出现,所以我无法得到用户的确认。

我试过了,

  • Toast.makeText()
  • 更改用户界面(TextView)
  • 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
}

1 个答案:

答案 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);
      }
  }
  //......