0

Android アプリケーションでインターネットを使用するにはスレッドを使用する必要があることはわかっていますが、その記述方法がわかりません。「JabberSmackAPI」という 1 つのクラス呼び出しがあります。このクラスには、XMPP を介してログイン、送信、および受信機能があります。

そして、アプリにボタンが1つあります。ボタンを押すと、googleTalkアカウントにログインする必要があります。

これはJavaプロジェクト(ログインしてメッセージを送信できます)ではうまく機能しますが、Androidアプリプロジェクトでは機能しません。「android.os.NetworkOnMainThreadException」というエラーが表示されます。

私のクラスは:

public class JabberSmackAPI 
{
    XMPPConnection connection;

    public void login(String userName, String password) throws XMPPException
    {
   ConnectionConfiguration config = new ConnectionConfiguration("talk.google.com",5222,"gmail.com");



        connection = new XMPPConnection(config);

    connection.connect();
    SASLAuthentication.supportSASLMechanism("PLAIN", 0);
    connection.login("email", "password");



    }

    public void sendMessage(String message, String to) throws XMPPException
    {
        Message msg = new Message(to, Message.Type.chat); 
        msg.setBody(message); 
        connection.sendPacket(msg);
        listeningForMessages();

    }




    public void disconnect()
    {
    connection.disconnect();
    }


    public void listeningForMessages() {
        PacketFilter filter = new AndFilter(new PacketTypeFilter(Message.class));
        PacketCollector collector = connection.createPacketCollector(filter);
        while (true) {
            Packet packet = collector.nextResult();
            if (packet instanceof Message) {
                Message message = (Message) packet;
                if (message != null && message.getBody() != null)
                    System.out.println("Received message from "
                            + packet.getFrom() + " : "
                            + (message != null ? message.getBody() : "NULL"));
            }
        }
    }

私のアプリコードは次のとおりです。

public class MainActivity extends Activity implements OnClickListener {
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);



    setContentView(R.layout.activity_main);



    Button btn1=(Button)findViewById(R.id.button1);
    btn1.setOnClickListener(this);




}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}

@Override
public void onClick(View v) {
    if(v.getId()==R.id.button1)
    {
        try{
            Toast.makeText(this, "T", Toast.LENGTH_LONG).show();



             JabberSmackAPI c = new JabberSmackAPI();
             c.login("username", "password");



        }
        catch(Exception e)
        {
            Log.e("Error","Error in code:"+e.toString());
            e.printStackTrace();
        }
}


    }
}
4

2 に答える 2

1

メイン アプリケーション スレッドは、インターフェイス関連の作業にのみ使用する必要があります。Android アプリケーションのメインスレッドではネットワークがまったく許可されていないため、マルチスレッドを使用する必要があります。アプリは永続的なデータ接続を必要とするため、AsyncTasksも機能しません。これは、起動、結果の取得、および接続の終了という単一サービスであるためです。

于 2013-03-12T12:50:49.040 に答える
0

android.os.NetworkOnMainThreadException

まさにそれを意味します-メイン/ UIスレッドでネットワーク操作を行わないでください

于 2013-03-12T13:00:43.743 に答える