2014-10-15 7 views
-1

안녕하세요 모든 사람들이 openfire servr 및 android Smack을 사용하여 채팅 코드를 사용할 때 약간의 문제가 있습니다. 내 로그 고양이에 오류가 있습니다. 여기 Android Smack chat with openfire server

package com.exm.dor; 

import java.util.ArrayList; 
import java.util.List; 

import org.jivesoftware.smack.*; 
import org.jivesoftware.smack.filter.*; 
import org.jivesoftware.smack.packet.*; 
import org.jivesoftware.smack.util.StringUtils; 
import org.jivesoftware.smack.ConnectionConfiguration; 

import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.view.View; 
import android.widget.*; 

public class MainActivity extends Activity { 
private final static String SERVER_HOST = "10.0.2.2"; 
private final static int SERVER_PORT = 5222; 
private final static String SERVICE_NAME = "search.drcode"; 
private final static String LOGIN = "dorperezz"; 
private final static String PASSWORD = "123123"; 


private List<String> m_discussionThread; 
private ArrayAdapter<String> m_discussionThreadAdapter; 
private XMPPConnection m_connection; 
private Handler m_handler; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    m_handler = new Handler(); 
    try { 
     initConnection(); 
    } catch (XMPPException e) { 
     e.printStackTrace(); 
    } 

    final EditText recipient = (EditText) this.findViewById(R.id.recipient); 
    final EditText message = (EditText) this.findViewById(R.id.message);   
    ListView list = (ListView) this.findViewById(R.id.thread); 

    m_discussionThread = new ArrayList<String>(); 
    m_discussionThreadAdapter = new ArrayAdapter<String>(this, 
      R.layout.multi_line_list_item, m_discussionThread); 
    list.setAdapter(m_discussionThreadAdapter); 

    Button send = (Button) this.findViewById(R.id.send); 
    send.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
      String to = recipient.getText().toString(); 
      String text = message.getText().toString(); 

      Message msg = new Message(to, Message.Type.chat); 
      msg.setBody(text); 
      m_connection.sendPacket(msg); 
      m_discussionThread.add("moi :"); 
      m_discussionThread.add(text); 
      m_discussionThreadAdapter.notifyDataSetChanged(); 
     } 
    }); 
} 


private void initConnection() throws XMPPException { 
    //Initialisation de la connexion 
    ConnectionConfiguration config = 
      new ConnectionConfiguration(SERVER_HOST, SERVER_PORT, SERVICE_NAME); 
    m_connection = new XMPPConnection(config); 
    m_connection.connect(); 
    m_connection.login(LOGIN, PASSWORD); 
    Presence presence = new Presence(Presence.Type.available); 
    m_connection.sendPacket(presence); 

    //enregistrement de l'יcouteur de messages 
    PacketFilter filter = new MessageTypeFilter(Message.Type.chat); 
    m_connection.addPacketListener(new PacketListener() { 
      public void processPacket(Packet packet) { 
       Message message = (Message) packet; 
       if (message.getBody() != null) { 
        String fromName = StringUtils.parseBareAddress(message 
          .getFrom()); 
        m_discussionThread.add(fromName + ":"); 
        m_discussionThread.add(message.getBody()); 

        m_handler.post(new Runnable() { 
         public void run() { 
          m_discussionThreadAdapter.notifyDataSetChanged(); 
         } 
        }); 
       } 
      } 
     }, filter); 
} 

} 

가 로그 캣입니다 : 내가의 내 코드에 worng받을 것을 잘 모릅니다 becuse 그냥 연결을위한 간단한 코드를 wanaa 내가 .. 여기 내 코드입니다

10-15 11:23:16.665: E/AndroidRuntime(1986): FATAL EXCEPTION: main 
10-15 11:23:16.665: E/AndroidRuntime(1986): Process: com.drcode.youplay, PID: 1986 
10-15 11:23:16.665: E/AndroidRuntime(1986): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.drcode.youplay/com.drcode.youplay.MainActivity}: android.os.NetworkOnMainThreadException 
10-15 11:23:16.665: E/AndroidRuntime(1986):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195) 
10-15 11:23:16.665: E/AndroidRuntime(1986):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) 
10-15 11:23:16.665: E/AndroidRuntime(1986):  at android.app.ActivityThread.access$800(ActivityThread.java:135) 
10-15 11:23:16.665: E/AndroidRuntime(1986):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
10-15 11:23:16.665: E/AndroidRuntime(1986):  at android.os.Handler.dispatchMessage(Handler.java:102) 
10-15 11:23:16.665: E/AndroidRuntime(1986):  at android.os.Looper.loop(Looper.java:136) 
10-15 11:23:16.665: E/AndroidRuntime(1986):  at android.app.ActivityThread.main(ActivityThread.java:5017) 
10-15 11:23:16.665: E/AndroidRuntime(1986):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-15 11:23:16.665: E/AndroidRuntime(1986):  at java.lang.reflect.Method.invoke(Method.java:515) 
10-15 11:23:16.665: E/AndroidRuntime(1986):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
10-15 11:23:16.665: E/AndroidRuntime(1986):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
10-15 11:23:16.665: E/AndroidRuntime(1986):  at dalvik.system.NativeStart.main(Native Method) 
10-15 11:23:16.665: E/AndroidRuntime(1986): Caused by: android.os.NetworkOnMainThreadException 
10-15 11:23:16.665: E/AndroidRuntime(1986):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145) 
10-15 11:23:16.665: E/AndroidRuntime(1986):  at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84) 
10-15 11:23:16.665: E/AndroidRuntime(1986):  at libcore.io.IoBridge.connectErrno(IoBridge.java:127) 
10-15 11:23:16.665: E/AndroidRuntime(1986):  at libcore.io.IoBridge.connect(IoBridge.java:112) 
10-15 11:23:16.665: E/AndroidRuntime(1986):  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 
10-15 11:23:16.665: E/AndroidRuntime(1986):  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459) 
10-15 11:23:16.665: E/AndroidRuntime(1986):  at java.net.Socket.connect(Socket.java:843) 
10-15 11:23:16.665: E/AndroidRuntime(1986):  at java.net.Socket.connect(Socket.java:786) 
10-15 11:23:16.665: E/AndroidRuntime(1986):  at org.jivesoftware.smack.proxy.DirectSocketFactory.createSocket(DirectSocketFactory.java:28) 
10-15 11:23:16.665: E/AndroidRuntime(1986):  at org.jivesoftware.smack.XMPPConnection.connectUsingConfiguration(XMPPConnection.java:550) 
10-15 11:23:16.665: E/AndroidRuntime(1986):  at org.jivesoftware.smack.XMPPConnection.connect(XMPPConnection.java:991) 
10-15 11:23:16.665: E/AndroidRuntime(1986):  at com.drcode.youplay.MainActivity.initConnection(MainActivity.java:74) 
10-15 11:23:16.665: E/AndroidRuntime(1986):  at com.drcode.youplay.MainActivity.onCreate(MainActivity.java:38) 
10-15 11:23:16.665: E/AndroidRuntime(1986):  at android.app.Activity.performCreate(Activity.java:5231) 
10-15 11:23:16.665: E/AndroidRuntime(1986):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
10-15 11:23:16.665: E/AndroidRuntime(1986):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159) 
+0

시도를 해결할 그렇게 생각 AsyncTask. –

+0

중복 가능한 [android.os.NetworkOnMainThreadException] (http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception) – 2Dee

+0

문제는 this android.os.NetworkOnMainThreadException입니다. 코드를 실행하기 위해 스레드를 사용하십시오. –

답변

1

이 방법을 시도, 이것이 당신의 문제를 해결하는 데 도움이되기를 바랍니다.

AsyncTask를 사용하면 응용 프로그램의 주 스레드가 아닌 다른 스레드에서 네트워크를 호출 할 수 있습니다.

public class MainActivity extends Activity { 
    private final static String SERVER_HOST = "10.0.2.2"; 
    private final static int SERVER_PORT = 5222; 
    private final static String SERVICE_NAME = "search.drcode"; 
    private final static String LOGIN = "dorperezz"; 
    private final static String PASSWORD = "123123"; 


    private List<String> m_discussionThread; 
    private ArrayAdapter<String> m_discussionThreadAdapter; 
    private XMPPConnection m_connection; 
    private EditText recipient; 
    private EditText message; 
    private ListView list; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     recipient = (EditText) this.findViewById(R.id.recipient); 
     message = (EditText) this.findViewById(R.id.message); 
     list = (ListView) this.findViewById(R.id.thread); 


     new ConnectToXmpp().execute(); 
     Button send = (Button) this.findViewById(R.id.send); 
     send.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View view) { 
       String to = recipient.getText().toString(); 
       String text = message.getText().toString(); 

       Message msg = new Message(to, Message.Type.chat); 
       msg.setBody(text); 
       m_connection.sendPacket(msg); 
       m_discussionThread.add("moi :"); 
       m_discussionThread.add(text); 
       m_discussionThreadAdapter.notifyDataSetChanged(); 
      } 
     }); 
    } 

    class ConnectToXmpp extends AsyncTask<Void, Void, Void> { 

     @Override 
     protected Void doInBackground(Void... params) { 
      try { 
       ConnectionConfiguration config = new ConnectionConfiguration(SERVER_HOST, SERVER_PORT, SERVICE_NAME); 
       m_connection = new XMPPConnection(config); 
       m_connection.connect(); 
       m_connection.login(LOGIN, PASSWORD); 
       Presence presence = new Presence(Presence.Type.available); 
       m_connection.sendPacket(presence); 

       PacketFilter filter = new MessageTypeFilter(Message.Type.chat); 
       m_connection.addPacketListener(new PacketListener() { 
        public void processPacket(Packet packet) { 
         Message message = (Message) packet; 
         if (message.getBody() != null) { 
          String fromName = StringUtils.parseBareAddress(message 
            .getFrom()); 
          m_discussionThread.add(fromName + ":"); 
          m_discussionThread.add(message.getBody()); 
          m_discussionThreadAdapter.notifyDataSetChanged(); 
         } 
        } 
       }, filter); 
      } catch (XMPPException e) { 
       e.printStackTrace(); 
      } 

      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      m_discussionThread = new ArrayList<String>(); 
      m_discussionThreadAdapter = new ArrayAdapter<String>(this,R.layout.multi_line_list_item, m_discussionThread); 
      list.setAdapter(m_discussionThreadAdapter); 
     } 

    } 
} 
+0

@Override protected void onPostExecute (무효 결과) { m_discussionThread = new ArrayList (); 여기에 문제가 있습니다 ** m_discussionThreadAdapter = new ArrayAdapter (this, R.layout.multi_line_list_item, m_discussionThread); ** list.setAdapter (m_discussionThreadAdapter); } – Code

+0

메시지가 수신되지 않습니다. 목록을 업데이트하는 중입니다. – mohitum

1
Caused by: android.os.NetworkOnMainThreadException 

이 당신의 문제입니다. 주 스레드에서 소켓을 연결하고 있습니다. 거기에 글로벌 서비스 인 커넥트 소켓을 만들어보십시오.

또한 해당 작업에 대한 재시도 정책을 제공 할 수 있습니다. 전체 작업을 수행하는 github에서 오픈 소스 프로젝트를 검색 할 수도 있습니다. 코드가 생산상의 문제를 해결하지 못하도록보다 안정적인 방식으로 프로젝트에 필요한 코드를 추가 할 수 있습니다. 참조 https://github.com/siacs/Conversations

0

Jsut (된 setContentView 후이 라인에서 onCreate()를 추가) 추가

:

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 

StrictMode.setThreadPolicy(policy); 

나는이 문제에 initConnection 코드를 넣어

관련 문제