2015-05-21 18 views
17

Tôi đang thực hiện cuộc gọi api còn lại từ thiết bị Android và thực sự ngạc nhiên khi thấy sự khác biệt về tốc độ khi so sánh với PC. Dưới đây là hình ảnh từ một công cụ còn lại trên PC. enter image description hereTại sao thời gian phản hồi (cho Cuộc gọi còn lại) chậm hơn trong Android khi so sánh với PC?

Tôi đã thử một vài thư viện như Retrofit, Volley và cũng có tác vụ Async thông thường để thực hiện cuộc gọi còn lại tương tự từ thiết bị Android và nhận thấy thời gian phản hồi sau.

(Response times with Retrofit library (Time includes converting json data to java objects)). 
Test 1: 8372 Ms 
Test 2: 7715 Ms 
Test 3: 7686 Ms 
Test 4: 10128 Ms 
Test 5: 7876 Ms 

(Response times with Volley. No conversion to Java Objects from Json Data) 
Test 1: 6721 MS 
Test 2: 6610 MS 
Test 3: 6287 MS 
Test 4: 6118 MS 
Test 5: 6118 MS 

tôi mất System.currentTimeMillis() trước khi thực hiện cuộc gọi và sau khi nhận được sự hưởng ứng và trừ những giá trị để có được trên thời gian đáp ứng trong chương trình Android.

Sẽ rất hữu ích nếu một số người có thể chỉ cho tôi cách giảm thời gian phản hồi trong Android.

FYI: Tôi đang sử dụng Wifi và sử dụng cùng một mạng cho cả PC và thiết bị Android của mình.

Đây là mã Retrofit Android

RestAdapter adapter = new RestAdapter.Builder() 
           .setEndpoint(ENDPOINT) 
           .build(); 

    WeatherApi weatherApi = adapter.create(WeatherApi.class); 
    startTime = System.currentTimeMillis(); 
    weatherApi.getWeather(location.getLatitude(),location.getLongitude(),new Callback<WeatherInfo>() { 

     @Override 
     public void success(WeatherInfo arg0, Response arg1) { 
      endTime = System.currentTimeMillis(); 
      Log.d("TAG",endTime-startTime + ":Millisecs"); 
      setWeatherInfo(arg0); 
      if(weatherDialog != null && weatherDialog.isShowing()) 
      weatherDialog.dismiss(); 
     } 
+1

Bạn có chắc chắn rằng bạn không thực sự đo thời gian sau khi xử lý kết quả cuộc gọi thay vì thời gian nhận phản hồi từ máy chủ không?Có thể đăng mã của bạn để cho biết nơi bạn đang tạo thời gian sẽ hữu ích –

+0

@EdGeorge được cập nhật bằng mã – Prakash

+0

Giữa thời gian bắt đầu và kết thúc, có quá trình chuyển đổi phản hồi JSON thành đối tượng 'WeatherInfo'. Thời gian bạn đã cung cấp sẽ chứa thời gian chuyển đổi bổ sung đó. Cơ thể bạn quay lại bao nhiêu và bạn có thể đăng lớp WeatherInfo POJO mà bạn đang sử dụng không? –

Trả lời

4

Retrofit là thuyết bất khả tri cho khách hàng HTTP nó sử dụng, vì vậy nó cố gắng tìm ra các khách hàng HTTP có sẵn tốt nhất nó có thể sử dụng để thực hiện các yêu cầu là gì.

Theo mặc định, Retrofit sử dụng GSON làm công cụ chuyển đổi (quá có thể được tùy chỉnh). Xem xét rằng GSON sử dụng sự phản chiếu để ánh xạ các phần tử JSON vào các thuộc tính lớp của bạn, sự phức tạp của lớp WeatherInfo có thể rất có một hình phạt về hiệu suất trên bước chuyển đổi.

Vì sự khác biệt trong trường hợp của bạn không hoàn toàn hợp lý, tôi đoán tốt nhất là GZIP bị tắt. Bạn có thể sử dụng RestAdapter.setLogLevel(LogLevel.FULL) và kiểm tra tiêu đề Accept-Encoding để xem GZIP có được bật hay không. Nếu đó không phải là trường hợp thì hãy đăng mã có liên quan hơn để chúng tôi có thể cung cấp thêm thông tin chi tiết. Một cách nhanh chóng mà tôi chắc chắn bạn sẽ nhận thấy một sự khác biệt rất lớn là nếu bạn bao gồm okhttp và okhttp-urlconnection - khi những người có sẵn trong classpath Retrofit sẽ sử dụng okhttp làm ứng dụng khách theo mặc định, hỗ trợ GZIP mà không cần bất kỳ cấu hình nào khác.

Bạn có thể làm như vậy bằng cách thêm các phụ thuộc sau đây để tập build.gradle của bạn:

compile 'com.squareup.okhttp:okhttp:2.4.0' 
compile 'com.squareup.okhttp:okhttp-urlconnection:2.4.0' 

Lưu ý rằng nén cũng phải được hỗ trợ trên các server-side, và tôi không chắc chắn nếu bạn' đã đăng đầu ra hoàn chỉnh của các tiêu đề phản hồi, nhưng có vẻ như thiếu một số thứ như Content-Encoding: gzip, nếu đó là trường hợp bạn nên xem xét bật tính năng này trên máy chủ web của mình.

1

Đoán của tôi là hệ thống Android của bạn bị quá tải hoặc dưới trình gỡ rối hoặc biên dịch valvik vm có hiệu lực ở đó.

Chỉ cần hết thời gian như 6 giây, điều này được hiểu rằng có một số hạn chế về mặt ngữ nghĩa, như tải CPU hoặc truy cập bộ nhớ SDHC.

Ngoài ra nếu bạn sử dụng trình mô phỏng để gỡ lỗi, đây có thể là lý do.

Các vấn đề liên quan