zoukankan      html  css  js  c++  java
  • 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();
            }
        }
  • 相关阅读:
    如果男人是计算机,女人是软件(在开发过程中的偶然随想)
    C/C++ 可变参数函数的原理和应用
    Python学习记录Hello Word
    Unity 把数字,英文图片变成字体
    unity+Android+PC加载本地图片
    Python学习记录安装
    Android学习 问题与答案
    Android 第三方 APK 包的静默安装
    Android学习 问题与答案 (2)
    JNI 之 HelloWorld
  • 原文地址:https://www.cnblogs.com/lljh/p/9199765.html
Copyright © 2011-2022 走看看