service里设置websocket心跳并向fragment发送数据
垃圾小白写了自己看的 /**
* service 文件
*/
public class SocketService extends Service { //自己定义接口用来传参
private static addNewOrderInterface mInterface; private SocketBinder socketBinder = new SocketBinder(); public static WebSocketClient client;
public static String address = "ws://192.168.0.2:8080/websocket/"; // 发送心跳包
private static Handler mHandler = new Handler();
private static Runnable heartBeatRunnable = new Runnable() {
@Override
public void run() {
mHandler.postDelayed(this, 10 * 1000);
sendMsg("@heart");
}
};
public static String message; @Override
public void onCreate() {
super.onCreate(); try {
initSocketClient(SharedUtils.getInstance().getToken());
} catch (URISyntaxException e) {
e.printStackTrace();
} } @Override
public int onStartCommand(Intent intent, int flags, int startId) {
L.e("执行了onStartCommand()");
connect();
return super.onStartCommand(intent, flags, startId);
} @Override
public void onDestroy() {
super.onDestroy();
L.e("执行了onDestory()");
} @Nullable
@Override
public IBinder onBind(Intent intent) {
return socketBinder;
} @Override
public boolean onUnbind(Intent intent) {
L.e("绑定服务");
return super.onUnbind(intent);
} @Override
public void unbindService(ServiceConnection conn) {
L.e("解绑服务");
super.unbindService(conn);
} public static void receiverMessage(String msg) {
if (mInterface != null) {
mInterface.addNewData(msg);
}
} public static class SocketBinder extends Binder { public void service_connect_Activity() {
mHandler.post(heartBeatRunnable);
L.e("Service关联了Activity,并在Activity执行了Service的方法"); } public String getNewOrder() {
return message;
} public void getOrder(String orderId) {
JSONObject object = new JSONObject();
try {
object.put("service", "RECEIVEORDER");
object.put("orderNo", orderId);
} catch (JSONException e) {
e.printStackTrace();
}
sendMsg(object.toString()); } public void addNewOrderInterface(addNewOrderInterface anInterface) {
mInterface = anInterface;
} } //断开连接
public static void closeConnect() {
try {
client.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
client = null;
}
} /**
* 发送消息
*/
public static void sendMsg(String msg) { L.e(msg);
if (client == null)
return;
try {
client.send(msg);
} catch (WebsocketNotConnectedException e) {
e.printStackTrace();
closeConnect();
try {
initSocketClient(SharedUtils.getInstance().getToken());
} catch (URISyntaxException ee) {
ee.printStackTrace();
}
connect();
}
} public static void initSocketClient(String token) throws URISyntaxException { if (client == null) {
client = new WebSocketClient(new URI(address + token)) { @Override
public void onOpen(ServerHandshake serverHandshake) {
//连接成功
L.e("socket连接成功");
} @Override
public void onMessage(String s) {
//服务端发送消息 通过接口传给fragment
receiverMessage(s);
} @Override
public void onClose(int i, String s, boolean remote) {
//连接断开,remote判定是客户端断开还是服务端断开
L.e("Connection closed by " + (remote ? "remote peer?" : "us") + ", info=" + s);
} @Override
public void onError(Exception e) {
L.e("error:" + e);
}
};
}
} //连接
public static void connect() { new Thread() {
@Override
public void run() {
if (client != null) {
try {
client.connect();
} catch (IllegalStateException e) {
L.e(e.toString());
}
}
L.e("socket连接");
}
}.start();
} }
/**
* 自己定义的接口
*/
public interface addNewOrderInterface {
void addNewData(String s);
}
/**
* 省略很多代码 从项目里摘出来的
* fragment的文件
*/
import static android.content.Context.BIND_AUTO_CREATE; //BaseFragment 自己写的
public class OrderReceiveFragment extends BaseFragment implements addNewOrderInterface {
private Order.OrderData.OrderList newOrder;
private SocketService.SocketBinder socketBinder = new SocketService.SocketBinder();
private ServiceConnection connection = new ServiceConnection() {
//重写onServiceConnected()方法和onServiceDisconnected()方法
// 在Activity与Service建立关联和解除关联的时候调用
@Override
public void onServiceDisconnected(ComponentName name) {
}
// // 在Activity与Service解除关联的时候调用
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//实例化Service的内部类myBinder
// 通过向下转型得到了MyBinder的实例
socketBinder = (SocketService.SocketBinder) service;
//在Activity调用Service类的方法
socketBinder.service_connect_Activity();
socketBinder.addNewOrderInterface(OrderReceiveFragment.this);
}
};
private Handler handler = new Handler() { @Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 0:
//推单
data.add(0, newOrder);
adapter.notifyDataSetChanged();
break;
case 1:
//心跳
break;
case 2:
//抢单
break;
}
}
}; //绑定service并启动服务
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Intent intent = new Intent(context, SocketService.class);
getActivity().getApplicationContext().bindService(intent, connection, BIND_AUTO_CREATE);
getActivity().getApplicationContext().startService(intent); } //自己写的接口里的方法
@Override
public void addNewData(String s) { try {
JSONObject jsonObject = new JSONObject(s);
String data = jsonObject.getString("data");
//使用handler更新数据 直接更新会空指针
Message message = new Message();
if (data.indexOf("receiveOrder") != -1) {
//抢单成功
message.what = 2;
}
if (data.indexOf("heart") != -1) {
//心跳
message.what = 1;
}
if (data.indexOf("pushOrder") != -1) { Gson gson = new Gson();
newOrder = gson.fromJson(data, Order.OrderData.OrderList.class);
message.what = 0;
message.obj = newOrder;
} handler.sendMessage(message);
// update(newOrder);
} catch (JSONException e) {
e.printStackTrace();
}
}
service里设置websocket心跳并向fragment发送数据的更多相关文章
- websocket心跳重连 websocket-heartbeat-js
初探和实现websocket心跳重连(npm: websocket-heartbeat-js) 心跳重连缘由 websocket是前后端交互的长连接,前后端也都可能因为一些情况导致连接失效并且相互之间 ...
- 初探和实现websocket心跳重连
心跳重连缘由 在使用websocket过程中,可能会出现网络断开的情况,比如信号不好,或者网络临时性关闭,这时候websocket的连接已经断开, 而浏览器不会执行websocket 的 onclos ...
- 理解WebSocket心跳及重连机制(五)
理解WebSocket心跳及重连机制 在使用websocket的过程中,有时候会遇到网络断开的情况,但是在网络断开的时候服务器端并没有触发onclose的事件.这样会有:服务器会继续向客户端发送多余的 ...
- 初探和实现websocket心跳重连(npm: websocket-heartbeat-js)
提示:文章最下方有仓库地址 心跳重连缘由 websocket是前后端交互的长连接,前后端也都可能因为一些情况导致连接失效并且相互之间没有反馈提醒.因此为了保证连接的可持续性和稳定性,websocket ...
- 安卓实训第九天---Activity的复习以及在Onstart里设置网络连接
今天.首先对Activity的生命周期进行复习: (以下的截图部分是借鉴自赵雅智老师的博客.. .) Activity的完整生命周期自第一次调用onCreate()開始.直至调用onDestroy() ...
- 一份你可以在 <head> 里设置的列表
A list of everything that could go in the <head> of your document github 原地址:https://github.co ...
- WebSocket心跳检测和重连机制
1. 心跳重连原由 心跳和重连的目的用一句话概括就是客户端和服务端保证彼此还活着,避免丢包发生. websocket连接断开有以下两证情况: 前端断开 在使用websocket过程中,可能会出现网络断 ...
- 在Eclipse里设置格式化代码时不格式化注释
在Eclipse里设置格式化代码时不格式化注释 今天格式化代码 发现直接format会把注释也一块格式化了,有时候会把好好的注释弄的很乱.甚为头疼. 查阅之后解决办法如下: Windows -> ...
- [转]在Linux里设置环境变量的方法
在Linux里设置环境变量的方法(export PATH) 一般来说,配置交叉编译工具链的时候需要指定编译工具的路径,此时就需要设置环境变量.例如我的mips-linux-gcc编译器在“/opt/a ...
随机推荐
- JavaMelody开源系统性能监控
https://blog.csdn.net/itopme/article/details/8618067
- 玲珑杯 ACM Round #10
A 题意:给长度为n的序列染黑白色,要求连续的黑的格子数量<=a,连续的白的格子数量<=b,问方案总数,有多个询问 分析:递推 注意数据范围,是可以O(n)做的,所以可以直接递推 B 题意 ...
- Memcached启动提示:cann't run as root without the -u switch
如果没有带 -u root 的话就会报: can't run as root without the -u switch 解决方法: 带-u root就行了. 出现的原因: 1.可能在root用户下启 ...
- 桦仔------分享一下我研究SQLSERVER以来收集的笔记
http://www.cnblogs.com/lyhabc/p/3219117.html
- CString、char*与string的区别
三者的区别 CString 是MFC或者ATL中的实现: string 是C++标准库中的实现: char* 为C编程中最常用的字符串指针,一般以’\0’为结束标志. string和CString均是 ...
- 万能存储工具类SDCard存储 /data/data/存储 assets存储 raw存储
万能存储工具类 SDCard存储 /data/data/存储 assets存储 raw存储 粘贴过去就能够用了 <uses-permission android:name="and ...
- 1.4-动态路由协议OSPF⑥
OSPF Network Type/网络类型 (Run Mode/运行模式) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 物理 ...
- 如何使用VB编写Excel的COM组件
1 新建工程中选择"外接程序",点击打开之后右侧的属性窗口即显示为MyAddIn工程.(注意如果你使用的是VB精简版的没有"外接程序"的选项,请下载完整版的) ...
- 总是有人想在android上直连mysql,是猴子请来的逗比吗?
总是有人想在android上直连mysql,都是是猴子请来的逗比吗?
- 算法竞赛入门经典 习题 2-10 排列(permutation)
习题 2-10 用1,2,3.....,9组成3个三位数abc.def和ghi,每一个数字恰好使用一次,要求abc:def:ghi=1:2:3.输出全部解. #include <stdio.h& ...