web-dev-qa-db-ja.com

AndroidおよびJava

RabbitMQのメインページにあるJavaパブリッシャーの 最初の例 を再現しようとしています。

最初に、Javaで実行しましたが、うまくいきました。次に、Androidで試してみましたが、ここが奇妙な部分です。

Javaプログラムで使用し、RabbitMQのチュートリアルで推奨されているものと同じjarライブラリを手動で追加しました。つまり、_amqp-client-5.4.1_、_slf4j-api-1.7.21_および_slf4j-simple-1.7.22_は_/libs_ディレクトリに追加され、次にbuid.gradle (module:app)でコマンドimplementation files('libs/amqp-client-5.4.1.jar')などを使用して参照されます。

次に、エラーが発生することなく、必要なパッケージの依存関係を_MainActivity.Java_ファイルに追加しました。ただし、データを公開する必要があるコードを追加すると、インポートされたライブラリのさまざまなメソッドが見つかりません。たとえば、factoryには、setHostメソッドがなかったため、表示されます。

現在使用しているコードを添付します。

_import Android.support.v7.app.AppCompatActivity;
import Android.os.Bundle;
import Java.io.IOException;
import Java.util.concurrent.TimeoutException;

import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;

public class MainActivity extends AppCompatActivity {

    String QUEUE_NAME = "hello";
    ConnectionFactory factory = new ConnectionFactory();

    factory.setHost("192.0.0.0"); //Marked as error
    factory.setUsername("test");
    factory.setPassword("test");
    Connection connection;
    Channel channel;
    connection = factory.newConnection();
    channel = connection.createChannel();

    channel.queueDeclare(QUEUE_NAME, false, false, false, null);
    String message = "Example3";
    channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
    System.out.println(" [x] Sent '" + message + "'");
    channel.close();
    connection.close();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}
_

このコードがJavaで正常に機能している理由のアイデアはありますが、これらのライブラリはAndroidに正しくインポートできませんか?

12
Alvaro Gomez

Javaでは、メソッドの外部にコードを含めることはできません。クラスメンバーを初期化することだけが可能です。私見では、jarインポートの問題ではありません。

これを試して:

import Android.support.v7.app.AppCompatActivity;
import Android.os.Bundle;
import Java.io.IOException;
import Java.util.concurrent.TimeoutException;

import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;

public class MainActivity extends AppCompatActivity {

    String QUEUE_NAME = "hello";
    ConnectionFactory factory = new ConnectionFactory();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
    }

    private void init() {
        try {
            factory.setHost("192.0.0.0");
            factory.setUsername("test");
            factory.setPassword("test");
            Connection connection;
            Channel channel;
            connection = factory.newConnection();
            channel = connection.createChannel();

            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            String message = "Example3";
            channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
            System.out.println(" [x] Sent '" + message + "'");
            channel.close();
            connection.close();
        } catch (IOException | TimeoutException e) {
            throw new RuntimeException("Rabbitmq problem", e);
        }
    }
}

元の懸念に戻ると、組み込みのGradle依存関係管理を使用するのではなく、すべての依存関係を手動でダウンロードする理由はわかりません。

build.gradleファイルの依存関係セクションを更新すると、必要な依存関係が自動的にダウンロードされます。依存関係を追加/削除/アップグレードする方がはるかに簡単です。

dependencies {
    compile group: 'com.rabbitmq', name: 'amqp-client', version: '5.4.1'
    compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.21'
    compile group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.21'
}
9
Benoit