Android:我在哪里可以在服务中实现socket.on(...)?我几次收到同样的消息

时间:2016-11-09 01:30:57

标签: android sockets service android-asynctask

我想在AsyncTask服务中使用套接字。我把监听器套接字放在onCreate中,并且我多次收到相同的消息。我不知道在哪里可以实现我的套接字侦听器,只能接收一次消息。谢谢您的帮助。这是我的代码:

public class SocketService extends Service {

final String TAG = "SocketService";
JSONObject sendMessage;
JSONObject sendUserPhone;
protected Socket socket;
String msg;

SessionManager session;

Handler handler;

private final IBinder mBinder = new MyBinder();

  public class MyBinder extends Binder {

    SocketService getService() {

        return SocketService.this;
    }
}

@Override
public void onCreate(){

    handler = new Handler();
     super.onCreate();



    Connection connection = new Connection();
    connection.execute();



    Identification identification = new Identification();
    identification.execute();


    Receive receive = new Receive();

    receive.execute();

}


@Override
public int onStartCommand(Intent intent, int flags, int startId) {


    session = new SessionManager(getApplicationContext());


    Bundle extras = intent.getExtras();

    if(extras!= null) {
        String emtr_phone =  session.getPhoneSession();
        String msg = extras.getString("message");
        String encPth = extras.getString("encodeImagePath");
        String dest1_phone =  extras.getString("dest1 phone");
        String dest2_phone =  extras.getString("dest2 phone");
        String dest3_phone =  extras.getString("dest3 phone");
        String dest4_phone =  extras.getString("dest4 phone");
        String dest5_phone =  extras.getString("dest5 phone");
        String dest6_phone =  extras.getString("dest6 phone");
        String dest7_phone =  extras.getString("dest7 phone");
        String dest8_phone =  extras.getString("dest8 phone");
        String dest9_phone =  extras.getString("dest9 phone");
        String dest10_phone =  extras.getString("dest10 phone");
        String dest11_phone =  extras.getString("dest11 phone");
        String dest12_phone =  extras.getString("dest12 phone");
        String dest13_phone =  extras.getString("dest13 phone");
        String dest14_phone =  extras.getString("dest14 phone");
        String dest15_phone =  extras.getString("dest15 phone");


          Send send = new Send();
        send.execute(emtr_phone, msg, encPth, dest1_phone,dest2_phone,dest3_phone, dest4_phone, dest5_phone, dest6_phone,dest7_phone,dest8_phone, dest9_phone, dest10_phone, dest11_phone,dest12_phone, dest13_phone, dest14_phone, dest15_phone);



    }

    return Service.START_STICKY;
  //  return Service.START_NOT_STICKY;
   // return Service.START_REDELIVER_INTENT;
}


private String encodeImage(String path) { 

    File imagefile = new File(path);
    FileInputStream fis = null;
    try {
        fis = new FileInputStream(imagefile);
    } catch (FileNotFoundException e) {

        e.printStackTrace();
    }

    Bitmap bm = BitmapFactory.decodeStream(fis);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bm.compress(Bitmap.CompressFormat.JPEG, 100, baos);
    byte[] b = baos.toByteArray();
    String encImage = Base64.encodeToString(b, Base64.DEFAULT);

    return encImage;
}

@Override
public IBinder onBind(Intent intent) {



    // TODO: Return the communication channel to the service.
    //  return mBinder;
    //throw new UnsupportedOperationException("Not yet implemented");
    return null;
}

@Override
public void onDestroy() {
    super.onDestroy();
    socket.disconnect();
    //   Disconnection disconnection = new Disconnection();
    // disconnection.execute();
}

class Connection extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... voids) {
        try {



            socket = IO.socket("http://ec2-53-17-78-94.eu-west-1.compute.amazonaws.com:8080"); 

        } catch (URISyntaxException e) {
            throw new RuntimeException(e);
        }


        socket.connect();

        return null;
    }
}

class Disconnection extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... voids) {

        socket.disconnect();

        return null;
    }
}


class Identification extends AsyncTask<Void, Void, Void> {


    @Override
    protected Void doInBackground(Void... voids) {
        // Session class instance
        SessionManager session = new SessionManager(getApplicationContext());

        String phone_session = session.getPhoneSession();
        sendUserPhone = new JSONObject();
        try {
            sendUserPhone.put("nbrphone", phone_session);
            socket.emit("adduser", sendUserPhone);

        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }


}

class Receive extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... voids) {


        Log.d(TAG, "onCreate");

        socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {

            @Override
            public void call(Object... args) {
                Log.d(getClass().getCanonicalName(), "Connected to server");
            }

        }).on(Socket.EVENT_DISCONNECT, new Emitter.Listener() {

            @Override
            public void call(Object... arg0) {
                Log.d(getClass().getCanonicalName(), "Disconnected from server");
            }

        });


        socket.on("message", new Emitter.Listener() {
            @Override
            public void call(Object... args) {


                JSONObject data = (JSONObject) args[0];
                Log.d(TAG, "Handling friendcall");
                //    String msg;
                //                          String imageText = null;

                try {
                    if (data.getString("image") != null) {

                        String message = data.getString("text").toString();
                        String imageText = data.getString("image");

                        Intent in = new Intent();
                        Bundle extras = new Bundle();
                        extras.putString("MsgWithImag", message);
                        extras.putString("Imag", imageText);
                        in.putExtras(extras);
                        in.setAction("NOW");

                        LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(in);
                        Log.d(TAG, "Call from : " + message + imageText);
                    }

                } catch (JSONException e) {
                    //  Log.d(TAG, "friend call object cannot be parsed");
                    e.printStackTrace();
                }

                try {
                    if (data.getString("sansPhoto") != null) {


                        String message = data.getString("text").toString();

                        Intent in = new Intent();
                        in.putExtra("Msg", message);
                        in.setAction("NOW");


                        LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(in);

                    }
                } catch (JSONException e) {
                    //  Log.d(TAG, "friend call object cannot be parsed");
                    e.printStackTrace();
                }
            }
        });


        Log.d(TAG, "onStartCommand. Socket should be up");


        return null;
    }
}

class Send extends AsyncTask<Object, Void, Void> {

    String emetr_phone, msg, encPth, sansPhoto, dest1_phone, dest2_phone, dest3_phone, dest4_phone, dest5_phone, dest6_phone, dest7_phone, dest8_phone, dest9_phone, dest10_phone, dest11_phone, dest12_phone, dest13_phone, dest14_phone, dest15_phone;


    @Override
    protected Void doInBackground(Object... params) {


        emetr_phone = (String) params[0];
        msg = (String) params[1];
        encPth = (String) params[2];
        sansPhoto = "g";
        dest1_phone = SupprCaractDest((String) params[3]);
        dest2_phone = SupprCaractDest((String) params[4]);
        dest3_phone = SupprCaractDest((String) params[5]);
        dest4_phone = SupprCaractDest((String) params[6]);
        dest5_phone = SupprCaractDest((String) params[7]);
        dest6_phone = SupprCaractDest((String) params[8]);
        dest7_phone = SupprCaractDest((String) params[9]);
        dest8_phone = SupprCaractDest((String) params[10]);
        dest9_phone = SupprCaractDest((String) params[11]);
        dest10_phone = SupprCaractDest((String) params[12]);
        dest11_phone = SupprCaractDest((String) params[13]);
        dest12_phone = SupprCaractDest((String) params[14]);
        dest13_phone = SupprCaractDest((String) params[15]);
        dest14_phone = SupprCaractDest((String) params[16]);
        dest15_phone = SupprCaractDest((String) params[17]);

        sendMessage = new JSONObject();

        //  String phone_emmet = SupprCaractEmmet(emetr_phone);
        try {

            sendMessage.put("emetr_phone", emetr_phone);

            if (msg != null) {

                sendMessage.put("text", msg);

            }

            if (encPth != null) {  //ImageBmp

                sendMessage.put("image", encodeImage(encPth));
                //  sendMessage.put("image", encodeImage(ImageBmp));

            } else {
                sendMessage.put("sansPhoto", sansPhoto);
            }

            sendMessage.put("dest1_phone", dest1_phone);
            sendMessage.put("dest2_phone", dest2_phone);
            sendMessage.put("dest3_phone", dest3_phone);
            sendMessage.put("dest4_phone", dest4_phone);
            sendMessage.put("dest5_phone", dest5_phone);
            sendMessage.put("dest6_phone", dest6_phone);
            sendMessage.put("dest7_phone", dest7_phone);
            sendMessage.put("dest8_phone", dest8_phone);
            sendMessage.put("dest9_phone", dest9_phone);
            sendMessage.put("dest10_phone", dest10_phone);
            sendMessage.put("dest11_phone", dest11_phone);
            sendMessage.put("dest12_phone", dest12_phone);
            sendMessage.put("dest13_phone", dest13_phone);
            sendMessage.put("dest14_phone", dest14_phone);
            sendMessage.put("dest15_phone", dest15_phone);

            socket.emit("message", sendMessage);

        } catch (JSONException e) {
            e.printStackTrace();
        }


        return null;
    }
}


public String SupprCaractDest(String dest_phone) {
    String carAsup = "+";
    dest_phone = dest_phone.replace(carAsup, "");

    return dest_phone;
}

}

1 个答案:

答案 0 :(得分:0)

您在初始化时使用您的代码,并在socketonCreate() close处向onDestroy()添加回调。但是,您应该在套接字初始化的同一个线程中添加回调(socket.on)(现在您将它们分成两个不同的AsyncTask)。

如果您有任何错误,您应该: - 检查您的onCreate()是否被多次呼叫。如果它被称为多个 - >你的其他代码有问题。否则,问题来自您的服务器代码。