2012-11-23 37 views
6

Trong ứng dụng của tôi, tôi đang sử dụng mã như sau để tải xuống một số hình ảnh. Có hiệu suất cao để làm điều đó như vậy hoặc tôi có thể tái sử dụng kết nối bằng cách nào đó không?Sử dụng lại HttpURLConnection

for(int i = 0; i < 100; i++){ 
    URL url = new URL("http://www.android.com/image" + i + ".jpg"); 
      HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
      try { 
      InputStream in = new BufferedInputStream(urlConnection.getInputStream()); 
      readStream(in); 
      finally { 
      urlConnection.disconnect(); 
      } 
     } 
} 

Trả lời

5

Bạn sẽ không thực sự nhận được bất kỳ lợi ích nào khi sử dụng lại số HttpURLConnection.

Một điều rất có lợi cho ứng dụng của bạn là nếu bạn dành một chút thời gian xem xét Async Tasks, điều này sẽ cho phép bạn khai thác sức mạnh của các yêu cầu HTTP đa luồng với các cuộc gọi lại tới mã chính của bạn.

Xem: http://www.vogella.com/articles/AndroidPerformance/article.html để biết ví dụ về cách sử dụng Công việc đồng bộ. Tuy nhiên,

Điểm khởi đầu tốt là tất nhiên là Blog dành cho nhà phát triển Android, nơi chúng có ví dụ để tải xuống hình ảnh từ máy chủ một cách không đồng bộ. Với một số điều chỉnh, bạn có thể yêu cầu ứng dụng gửi nhiều yêu cầu không đồng bộ cùng một lúc để có hiệu suất tốt.

Các bài viết Google có thể được tìm thấy tại địa chỉ: http://android-developers.blogspot.co.uk/2009/05/painless-threading.html

Diện tích chìa khóa để nhìn vào là:

public void onClick(View v) { 
    new DownloadImageTask().execute("http://example.com/image.png"); 
} 

private class DownloadImageTask extends AsyncTask { 
    protected Bitmap doInBackground(String... urls) { 
     return loadImageFromNetwork(urls[0]); 
    } 

    protected void onPostExecute(Bitmap result) { 
     mImageView.setImageBitmap(result); 
    } 
} 

Phương pháp loadImageFromNetwork là nơi tải diễn ra, và sẽ hoàn toàn không đồng bộ xa giao diện người dùng chính của bạn.

Như một ví dụ cơ bản, bạn có thể sửa đổi ứng dụng của bạn để gọi đây là như vậy:

for(int i = 0; i < 100; i++){ 
    new DownloadImageTask().execute("http://www.android.com/image" + i + ".jpg"); 
} 

Dù cho việc tối ưu, tôi sẽ không ném 100 yêu cầu ra cùng một lúc, có thể tạo ra một hệ thống hàng đợi Threaded mà sẽ cho phép có thể 4 hoặc 5 kết nối đồng thời và sau đó giữ phần còn lại đến khi một kết thúc khác bằng cách duy trì một số yêu cầu để đọc.

0

Bất kể bạn làm như thế nào, bạn sẽ kết thúc việc mở nhiều kết nối, một để có được mỗi hình ảnh. Đây là cách nhận được bất kỳ hình ảnh nào. Và không có cách nào để thay đổi HttpURLConnection. Vì vậy, điều này có thể tốt từ ý nghĩa đó.

Tuy nhiên, bạn có thể thử tải nhiều hình ảnh cùng một lúc thông qua luồng. Nó sẽ hơi phức tạp để thực hiện một kế hoạch như vậy, nhưng hoàn toàn có thể. Nó sẽ tăng tốc quá trình bằng cách yêu cầu nhiều hình ảnh cùng một lúc.

+2

Nó kết nối tổng hợp phía sau hậu trường. – EJP

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