public void startSearch() {
   Log.d(TAG, "Start search.");
   if (mStarted) {
     Log.d(TAG, "startSearch() ignore, search is already started.");
     return;
   }
   mStarted = true;
   NetWorkUtil.acquireWifiMultiCastLock(mContext);
   Thread searchThread = new Thread(this);
   searchThread.start();
 }
  public void stopSearch() {
    Log.d(TAG, "Stop search");
    mStarted = false;
    mStopped = true;
    leaveGroup(mMulticastAddress);
    NetWorkUtil.releaseWifiMultiCastLock();

    closeSocket();
    mInstance = null;
  }
    public void run() {
      DatagramPacket inPacket;

      while (!mStopped) {
        try {
          inPacket = new DatagramPacket(new byte[1024], 1024);
          mReceiveSocket.receive(inPacket);
          byte[] data = inPacket.getData();

          SearchProtocol.decodeSearchLan(data, mListener);
        } catch (Exception e) {
          if (e instanceof SocketTimeoutException) {
            // time out, search again.
            Log.d(TAG, "GetPacket time out. search again.");
          } else {
            Log.e(TAG, "GetPacket error," + e.toString());
            if (mListener != null) {
              mListener.onSearchStop();
            }
          }
        }
      }
    }