0

Xmppチャットアプリケーションに取り組んでいます。

私のPacketListenerで、サブスクリプションリクエストを処理しようとしていますが、AlertDialogを除いて、すべてチャームのように機能しています。表示されないため、ユーザーからの確認が取れません。

私はもう試した 、

  • Toast.makeText()
  • UI(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
}
4

1 に答える 1

0

同じ問題に遭遇したのはこれで 2 回目ですが、1 回目は構造が異なっていたため、最初はわかりませんでした。

しかし、@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 に答える