0

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

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

我试过了 ,

  • Toast.makeText()
  • 更改 UI(文本视图)
  • 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
}
4

1 回答 1

0

这是我第二次遇到同样的问题,但第一次的结构不同,所以第一次我无法弄清楚。

但是@Robin的评论让我摆脱了问题。

正如他所说,我必须在 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);
      }
  }
  //......
于 2013-01-21T23:34:57.293 回答