Измерение сетевого трафика с Инди

В своей LensActivity вы создаете намерение, которое никогда не используете. Намерение таково:

Intent lensIntent = new Intent(LensActivity.this,MainActivity.class);
lensIntent.putExtra("LensIntent",lensString);

Вместо этого вы должны создать его в прослушивателе щелчка элементов. Просто удалите приведенный выше код и измените слушателя следующим образом:

mAdapter.setOnItemClickListener(new LensAdapter.OnItemClickListener() {
        @Override
        public void onItemClick(int position) {
           //Crea String con la informacion de posicion y texto del lente
            String lensPosition = lensList.get(position).getLens();
            lensString = lensPosition;
            Intent lensIntent = new Intent(LensActivity.this,MainActivity.class);
            lensIntent.putExtra("LensIntent",lensString);
            Toast.makeText(getApplicationContext(),"this is " + lensString , Toast.LENGTH_SHORT).show();
            startActivity(lensIntent);
        }
    });
5
задан jpfollenius 18 February 2009 в 09:11
поделиться

3 ответа

Спасибо вам обоим очень за Ваши ответы. Я принял решение реализовать его, путь mghie описал это - путем реализации пользовательского класса перехватчика для моих соединений. Только для заинтересованных решением, я обеспечу некоторый исходный код здесь:

type
  TCountTrafficInterceptor = class (TIdConnectionIntercept)
  public
    type TIntPointer = ^Longint;
  private
    FTraffic : TIntPointer;
  public
    constructor Create (TrafficVar : TIntPointer);
    procedure Send (var ABuffer : TIdBytes); override;
    procedure Receive (var ABuffer : TIdBytes); override;
  end;

constructor TCountTrafficInterceptor.Create (TrafficVar : TIntPointer);
begin
  FTraffic := TrafficVar;
end;

procedure TCountTrafficInterceptor.Send (var ABuffer : TIdBytes);
begin
  inherited Send (ABuffer);
  FTraffic^ := FTraffic^ + Length (ABuffer);
end;

procedure TCountTrafficInterceptor.Receive (var ABuffer : TIdBytes);
begin
  inherited Receive (ABuffer);
  FTraffic^ := FTraffic^ + Length (ABuffer);
end;

И в методе OnConnect TIdTCPCmdServer:

AContext.Connection.IOHandler.Intercept := 
  TCountTrafficInterceptor.Create (@FNetworkTraffic);

Работает отлично, просто вид решения, которое я искал. Еще раз спасибо за Ваши ответы.

Btw: Как я могу использовать (в), входят в систему мои сообщения? Я всегда получаю блок цитирования, когда я пытаюсь ввести его...

3
ответ дан 18 December 2019 в 13:19
поделиться

Изучите классы прерывания Инди. Необходимо смочь создать пользовательский класс прерывания, который переопределяет Получение (), и Отправьте (), методы, и в дополнение к вызову методов базового класса реализуют транспортное вычисление. Уже существуют классы прерывания, чтобы сделать вход, Вы соединили бы свой пользовательский класс таким же образом.

Документация TIdConnectionIntercept должна быть хорошей начальной точкой. Существует также очень простой пример здесь о том, как создать и соединить прерывание во времени выполнения.

7
ответ дан 18 December 2019 в 13:19
поделиться

Перенестись TCPCmdServer в класс, который регистрирует трафик.

Можно получить класс из TCPCmdServer, и переопределение отправляют и получают методы, если они являются виртуальными.

Что-то как:

type
  TTcpCmdServerWithLogging = class(TTcpCmdServer)
    ...
    procedure SendReply; override;

implementation
    procedure SendReply;
    begin
      inherited SendReply;
      Inc (FTraffic, Sizeof (NormalReply.Code) +
           Sizeof (Char) * NormalReply.Text.Length)); 
    end;

Если они не являются виртуальными, то создают новый класс, который инстанцирует TCPCmdServer, и выставьте требуемые методы и свойства.

4
ответ дан 18 December 2019 в 13:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: