垃圾小白写了自己看的

/**
* 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发送数据的更多相关文章

  1. websocket心跳重连 websocket-heartbeat-js

    初探和实现websocket心跳重连(npm: websocket-heartbeat-js) 心跳重连缘由 websocket是前后端交互的长连接,前后端也都可能因为一些情况导致连接失效并且相互之间 ...

  2. 初探和实现websocket心跳重连

    心跳重连缘由 在使用websocket过程中,可能会出现网络断开的情况,比如信号不好,或者网络临时性关闭,这时候websocket的连接已经断开, 而浏览器不会执行websocket 的 onclos ...

  3. 理解WebSocket心跳及重连机制(五)

    理解WebSocket心跳及重连机制 在使用websocket的过程中,有时候会遇到网络断开的情况,但是在网络断开的时候服务器端并没有触发onclose的事件.这样会有:服务器会继续向客户端发送多余的 ...

  4. 初探和实现websocket心跳重连(npm: websocket-heartbeat-js)

    提示:文章最下方有仓库地址 心跳重连缘由 websocket是前后端交互的长连接,前后端也都可能因为一些情况导致连接失效并且相互之间没有反馈提醒.因此为了保证连接的可持续性和稳定性,websocket ...

  5. 安卓实训第九天---Activity的复习以及在Onstart里设置网络连接

    今天.首先对Activity的生命周期进行复习: (以下的截图部分是借鉴自赵雅智老师的博客.. .) Activity的完整生命周期自第一次调用onCreate()開始.直至调用onDestroy() ...

  6. 一份你可以在 <head> 里设置的列表

    A list of everything that could go in the <head> of your document github 原地址:https://github.co ...

  7. WebSocket心跳检测和重连机制

    1. 心跳重连原由 心跳和重连的目的用一句话概括就是客户端和服务端保证彼此还活着,避免丢包发生. websocket连接断开有以下两证情况: 前端断开 在使用websocket过程中,可能会出现网络断 ...

  8. 在Eclipse里设置格式化代码时不格式化注释

    在Eclipse里设置格式化代码时不格式化注释 今天格式化代码 发现直接format会把注释也一块格式化了,有时候会把好好的注释弄的很乱.甚为头疼. 查阅之后解决办法如下: Windows -> ...

  9. [转]在Linux里设置环境变量的方法

    在Linux里设置环境变量的方法(export PATH) 一般来说,配置交叉编译工具链的时候需要指定编译工具的路径,此时就需要设置环境变量.例如我的mips-linux-gcc编译器在“/opt/a ...

随机推荐

  1. [K/3Cloud] 首页增加一个自定义页签及页面内容

    在K3Cloud登录后的门户首页增加一个页签,如增加一个[BBS论坛] 2013-7-30 11:18:51 上传 下载附件 (84.81 KB)  增加页签 可以这么来做: 进入BOS IDE ,找 ...

  2. JS动态添加div,然后在div中添加元素

    需求: 组织部中有个这样的需求,根据年份动态显示该年份下的定性指标! 我的做法: 先是放一个空的div,让后根据指标的数据,动态的往div中添加元素. 代码: 空的div,存放定性指标 <div ...

  3. nyoj_68_三点顺序_201404152013

    三点顺序 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 现在给你不共线的三个点A,B,C的坐标,它们一定能组成一个三角形,现在让你判断A,B,C是顺时针给出的还是逆 ...

  4. 线程间的通信----wait/notify机制

    wait/notify机制 实现多个线程之间的通信可以使用wait.notify.notifyAll三个方法.这三个方法都是Object类的方法.wait():导致当前线程等待,直到另一个线程调用此对 ...

  5. HDU 1248寒冰王座-全然背包或记忆化搜索

    寒冰王座 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  6. 国际维修联合会IMA年度大会在瑞士圆满结束

    瑞士卢加诺 ☆2016年4月5日至7日 中国设备管理协会国际交流合作中心主任.学府咨询(国际)集团董事长.IMA中国分会主席李葆文教授,应邀出席了4月5日至7日在瑞士卢加诺召开的国际维修联合会年度大会 ...

  7. ganglia收集hbase的metrics

    Ganglia 是 UC Berkeley 发起的一个开源监视项目,设计用于測量数以千计的节点.每台计算机都执行一个收集和发送度量数据(如处理器速度.内存使用量等)的名为 gmond 的守护进程.它将 ...

  8. swift 2.0 语法 循环

    //: Playground - noun: a place where people can play import UIKit /*: for循环 * 基本用法和OC一致 * 条件表达式必须是bo ...

  9. ITK Configuring and Building in VisualStudio及hello world程序编译

    1. ITK Configuring and Building in VisualStudio With Visual Studio 2010 on Windows 7 (32-bit): Launc ...

  10. 从一个小demo开始,体验“API经济”的大魅力

    写在前面 “API经济”这个词是越来越火了,但是"API经济"具体指的是什么,相信很多人还没有个明确的认识.不过今天我可不打算长篇大论的去讲解一些概念,我们就以“电话号码归属地查询 ...