2013-01-19 4 views
0

Xmpp 채팅 응용 프로그램에서 작업 중입니다.메시지 처리기에서 AlertDialog 사용

내 PacketListener에서 구독 요청을 처리하려고하는데 AlertDialog를 제외한 모든 기능이 작동합니다. 표시되지 않으므로 사용자로부터 확인을받을 수 없습니다.

내가 해봤

  • Toast.makeText()
  • getApplicationContext() 대신 Display.this

UI (텍스트 뷰) 변경 그러나 그들 중 누구도 작동하지 않습니다.

내가 말했듯이, 나는 어떤 에러도 내지 않았고, 또한 디버깅을 시도했다. 코드면에서 작동하는 것 같다.

다음

내 코드는,

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

Handler를 사용하여이 문제를 해결하기 위해, UI 위젯을 사용하는 UI 스레드에서해야 말했듯이. 나 자신 안드로이드를 사용하지 않은하지만 이것은 일반적으로 자바 GUI 프레임 워크의 경우입니다. 그 외에도 독자 상호 작용을 통해 독자 스레드를 차단하고 있습니다.이 IMHO는 매우 나쁜 생각입니다. – Robin

+0

@Robin, 귀하의 의견은 내 문제를 고맙게 생각하는 데 매우 도움이되었다. – ocanal

답변

0

이 내가 같은 문제가 발생했습니다 두 번째 시간입니다,하지만 난 그것을 알아낼 수 없었다 처음에, 그래서 첫 번째는 다른 구조를 가지고 있었다.

그러나 @Robin's comment은 나를 괴롭힌다.

그는 내가 당신이 UI 위젯을 사용하기 위해 UI 스레드에있을 필요가 생각

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); 
     } 
    } 
    //...... 
관련 문제