消息推送方式挺多的,这次用了下RabbitMQ这一款,下面简单介绍一下android端应该如何接受服务端那边发送的消息
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.TextView;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MainActivity extends AppCompatActivity {
private final static String EXCHANGE = "Signal";
Thread subscribeThread;
ConnectionFactory factory;
private String mMessage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
factory = new ConnectionFactory();
//下面参数这里要根据实际改
factory.setHost("10.168.2.92");
factory.setUsername("Test");
factory.setPassword("Test");
factory.setVirtualHost("TestV1");
//用于从线程中获取数据,更新ui 把消息根据来的时间写到界面上 测试效果更佳明显 可要可不要
final Handler incomingMessageHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
String message = msg.getData().getString("msg");
TextView tv = (TextView) findViewById(R.id.textView);
Date now = new Date();
SimpleDateFormat ft = new SimpleDateFormat("hh:mm:ss");
tv.append(ft.format(now) + ' ' + message + '\n');
Log.i("test", "msg:" + message);
}
};
//开启消费者线程
subscribe(incomingMessageHandler);
}
/**
* 消费者线程
*/
void subscribe(final Handler handler) {
subscribeThread = new Thread(new Runnable() {
@Override
public void run() {
// while (true) {
try {
//使用之前的设置,建立连接
Connection connection = factory.newConnection();
//创建一个通道
Channel channel = connection.createChannel();
//一次只发送一个,处理完成一个再获取下一个
channel.basicQos(1);
channel.exchangeDeclare(EXCHANGE,"fanout");//这里要根据实际改
String mQueue = channel.queueDeclare().getQueue();
channel.queueBind(mQueue,EXCHANGE,"");//这里要根据实际改
//创建消费者
// QueueingConsumer consumer = new QueueingConsumer(channel);
// channel.basicConsume(mQueue, true, consumer);
//
// while (true) {
// Log.i("我是创建的对象", "1");
// //wait for the next message delivery and return it.
// QueueingConsumer.Delivery delivery = consumer.nextDelivery();
// String message = new String(delivery.getBody());
//
// Log.d("", "[r] " + message);
//
// //从message池中获取msg对象更高效
// Message msg = handler.obtainMessage();
// Bundle bundle = new Bundle();
// bundle.putString("msg", message);
// msg.setData(bundle);
// handler.sendMessage(msg);
// }
// } catch (InterruptedException e) {
// Log.i("我是创建的对象", "1");
// break;
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope,
AMQP.BasicProperties properties, byte[] body) throws IOException {
mMessage = new String(body, "UTF-8");
System.out.println(" [x] Received '" + envelope.getRoutingKey() + "':'" + mMessage + "'");
// 从message池中获取msg对象更高效
Message msg = handler.obtainMessage();
Bundle bundle = new Bundle();
bundle.putString("msg", mMessage);
msg.setData(bundle);
handler.sendMessage(msg);
}
};
channel.basicConsume(mQueue, true, consumer);
//
} catch (Exception e1) {
Log.d("", "Connection broken: " + e1.getClass().getName());
try {
Thread.sleep(2000); //sleep and then try again
} catch (InterruptedException e) {
// break;
}
}
Log.i("1111111111111111111111", "run: ");
// }
}
});
subscribeThread.start();
}
}
中间取消息有两种办法 一种我注释了 还有一种写上去了 反正两个都差不多,喜欢那种都行 如果领导看while (true)怕的话就用第二种,其实第一种也不是死循环,
consumer.nextDelivery();是个阻塞式方法,有消息来才会动,记得要自己添加jar包进去,下载