Android 在消息处理程序中使用AlertDialog

Android 在消息处理程序中使用AlertDialog,android,xmpp,handler,android-alertdialog,asmack,Android,Xmpp,Handler,Android Alertdialog,Asmack,我正在开发一个Xmpp聊天应用程序 在我的PacketListener中,我正在尝试处理订阅请求,除了AlertDialog之外,所有这些都像一个符咒一样工作。它没有显示,所以我无法从用户那里得到确认 我试过了 Toast.makeText() 更改用户界面(文本视图) getApplicationContext()而不是显示。此 但它们都不起作用 正如我所说,我没有得到任何错误,我也尝试过调试,它似乎在代码方面工作 这是我的密码 //imports.... public class Dis

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

在我的PacketListener中,我正在尝试处理订阅请求,除了AlertDialog之外,所有这些都像一个符咒一样工作。它没有显示,所以我无法从用户那里得到确认

我试过了

  • Toast.makeText()
  • 更改用户界面(文本视图)
  • getApplicationContext()
    而不是
    显示。此
但它们都不起作用

正如我所说,我没有得到任何错误,我也尝试过调试,它似乎在代码方面工作

这是我的密码

//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
}

这是我第二次遇到同样的问题,但第一次的结构不同,所以第一次我就想不出来了

但这让我摆脱了这个问题

正如他所说,我必须在UI线程上使用UI小部件,以解决我使用的这个问题


我认为您需要在UI线程上使用UI小部件。我自己没有使用过Android,但java GUI框架通常就是这样。除此之外,您还通过用户交互阻止了阅读器线程,这是一个非常糟糕的主意。@Robin,您的评论对解决我的问题非常有帮助,谢谢。
  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);
      }
  }
  //......