2016-08-04 21 views
6

Tôi cần đo tốc độ gửi SMS trong thiết bị Android. Tôi đang suy nghĩ về cách tiếp cận dưới đây. Xin vui lòng cho tôi biết nếu nó là chính xác, hoặc nếu có một giải pháp tốt hơn.Đo tốc độ gửi SMS

Tính toán thời gian dành cho 10 tin nhắn và tính toán thời gian trung bình dành cho việc gửi mỗi tin nhắn. Nhưng đâu là tốc độ ở đây? Số lượng nhân vật có tăng thời gian sử dụng không?

Đây là mã tôi đã viết.

SmsManager smsManager = SmsManager.getDefault(); 
    long startTime = System.currentTimeMillis(); 

    smsManager.sendTextMessage("1234567890",null,text,null,null); 
    smsManager.sendTextMessage("1234567890",null,text,null,null); 
    smsManager.sendTextMessage("1234567890",null,text,null,null); 
    smsManager.sendTextMessage("1234567890",null,text,null,null); 
    smsManager.sendTextMessage("1234567890",null,text,null,null); 
    smsManager.sendTextMessage("1234567890",null,text,null,null); 
    smsManager.sendTextMessage("1234567890",null,text,null,null); 
    smsManager.sendTextMessage("1234567890",null,text,null,null); 
    smsManager.sendTextMessage("1234567890",null,text,null,null); 

    long endTime = System.currentTimeMillis(); 

    long result = endTime - startTime; 

result là 742 mili giây, nhưng tôi nghi ngờ điều đó là chính xác. Điều đó có nghĩa là mỗi SMS chỉ mất 74 mili giây.

+0

chỉ vì tò mò, có gì sai với 74ms? là nó quá dài? – lelloman

+0

Khi tôi thử gửi SMS bằng thiết bị, mất khoảng 1,5 giây để gửi. –

+0

Bạn đang giả định rằng cuộc gọi là đồng bộ mà tôi rất nghi ngờ. Hầu hết các likley 74ms là chỉ để xếp hàng các tin nhắn SMS trong một hàng đợi gửi đi, không thực sự thiết lập một liên kết vô tuyến với trạm cơ sở gần nhất và gửi tin nhắn. – mach

Trả lời

2

Phương thức sendTextMessage() sẽ lấy thông số thứ tư là PendingIntent sẽ kích hoạt khi thư được gửi. Chúng tôi có thể đính kèm thời gian hệ thống hiện tại dưới dạng phụ thêm vào số Intent cho số PendingIntent và khi nó kích hoạt, hãy truy xuất thêm và so sánh nó với thời gian hệ thống hiện tại. Điều này sẽ cung cấp cho chúng tôi một biện pháp phong nha về việc phải mất bao lâu để thực sự gửi tin nhắn.

Chúng tôi sẽ sử dụng BroadcastReceiver để xử lý PendingIntent, chỉ cần truy xuất thêm thời gian đã gửi trong số onReceive() và tìm thời gian đã trôi qua từ thời điểm hiện tại tại đó.

BroadcastReceiver smsSendReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     long sentTime = intent.getLongExtra("sent_time", 0); 
     long elapsedTime = System.currentTimeMillis() - sentTime; 
     Toast.makeText(context, elapsedTime + "ms", Toast.LENGTH_SHORT).show(); 
    } 
}; 

Chúng tôi cần phải đăng ký Người nhận này trước khi gửi thư. Trong một Activity hoặc Service:

registerReceiver(smsSendReceiver, new IntentFilter("SMS_SENT")); 

trong gửi tin nhắn của chúng tôi, chúng tôi sẽ kinda "nhồi nhét" việc xây dựng PendingIntent ngay vào sendTextMessage() cuộc gọi, vì vậy chúng tôi không vô tình giới thiệu bất kỳ sự trì hoãn không cần thiết giữa grabbing thời điểm hiện tại, và thực sự thực hiện cuộc gọi.

SmsManager sm = SmsManager.getDefault(); 
sm.sendTextMessage("1234567890", 
        null, 
        "Testing...", 
        PendingIntent.getBroadcast(this, 
               0, 
               new Intent("SMS_SENT") 
                .putExtra("sent_time", 
                  System.currentTimeMillis()), 
               0), 
        null); 

Nếu muốn, điều này có thể chạy nhiều lần và được tính trung bình từ kết quả. Hãy chắc chắn xử lý các PendingIntent s một cách thích hợp nếu làm như vậy, để đảm bảo rằng thời gian gửi chính xác được gửi cho mỗi phát sóng. Trong ví dụ cụ thể, một cách dễ dàng để thực hiện việc này là sử dụng mã yêu cầu khác - đối số thứ hai trong số getBroadcast() - cho mỗi cuộc gọi.

Bạn nên hủy đăng ký người nhận khi bạn đã hoàn thành nó, vì sợ rằng bạn sẽ nhận được thông báo khó chịu trong nhật ký của mình về Người nhận bị rò rỉ.

unregisterReceiver(smsSendReceiver);