изображение из URL-адреса для рисования или растрового изображения: лучший и быстрый способ - PullRequest
0 голосов
/ 08 августа 2011

Я пытался показать изображения из URL в моем приложении. Но способы, которыми я пользуюсь, очень длинные. этот код я основал на stackoverflow

public  Bitmap getImage(String url,String src_name) throws java.net.MalformedURLException, java.io.IOException {
            Bitmap bitmap;
            HttpURLConnection connection = (HttpURLConnection)new URL(url) .openConnection();
            connection.setRequestProperty("User-agent","Mozilla/4.0");

            connection.connect();
            InputStream input= connection.getInputStream();

            bitmap = BitmapFactory.decodeStream(input);

            return bitmap;
}

10 изображений загружаются за 10-12 секунд. если использовать этот код.

и

 ///==========================================================================================================================================
     public   Drawable getImage(String url, String src_name) throws java.net.MalformedURLException, java.io.IOException 
        {

         Drawable abc =Drawable.createFromStream(((java.io.InputStream)new java.net.URL(url).getContent()), src_name);

            return abc;


        }   

при использовании этого кода - изображения загружаются за 9-11 секунд. Изображения не большие. максимальная ширина или высота 400-450. Конечно, я говорю эту функцию в цикле, как это: for (int i =0;i<10;i++){image[i]=getImage(url);} Может кто-нибудь сказать, как лучше и быстрее показать изображение в моем приложении? С уважением, Питер.

Ответы [ 3 ]

1 голос
/ 08 августа 2011

Нельзя отменить время, необходимое для загрузки и декодирования изображений.Число «10» является просто функцией качества изображения, и вы можете только попытаться оптимизировать это число.

Если вы управляете сервером, вы можете потратить некоторое время на оптимизацию размера загружаемых изображений с учетом требований вашего пользовательского интерфейса.Также попробуйте ленивую загрузку (надеюсь, вы не выполняете эти операции в потоке пользовательского интерфейса).Многие решения для отложенной загрузки и отложенного декодирования обсуждались много раз: http://www.google.com.sg/search?q=android+images+lazy+load&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a

Sidenote : использование HttpURLConnection не рекомендуется.Используйте HttpClient.Это также может повлиять на производительность.Взгляните на http://lukencode.com/2010/04/27/calling-web-services-in-android-using-httpclient/

0 голосов
/ 10 мая 2012
public static Bitmap decodeFile(String filePath) {
    // Decode image size
    BitmapFactory.Options o = new BitmapFactory.Options();
    o.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(filePath, o);

    // The new size we want to scale to
    final int REQUIRED_SIZE = 1024;

    // Find the correct scale value. It should be the power of 2.
    int width_tmp = o.outWidth, height_tmp = o.outHeight;
    int scale = 1;
    while (true) {
        if (width_tmp < REQUIRED_SIZE && height_tmp < REQUIRED_SIZE)
            break;
        width_tmp /= 2;
        height_tmp /= 2;
        scale *= 2;
    }

    // Decode with inSampleSize
    BitmapFactory.Options o2 = new BitmapFactory.Options();
    o2.inSampleSize = scale;
    Bitmap bitmap = BitmapFactory.decodeFile(filePath, o2);
    return bitmap;
}
0 голосов
/ 10 мая 2012
public static Bitmap getBitmapFromUrl(String url) {
    Bitmap bitmap = null;
    HttpGet httpRequest = null;
    httpRequest = new HttpGet(url);
    HttpClient httpclient = new DefaultHttpClient();

    HttpResponse response = null;
    try {
        response = (HttpResponse) httpclient.execute(httpRequest);
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    if (response != null) {
        HttpEntity entity = response.getEntity();
        BufferedHttpEntity bufHttpEntity = null;
        try {
            bufHttpEntity = new BufferedHttpEntity(entity);
        } catch (IOException e) {
            e.printStackTrace();
        }

        InputStream instream = null;
        try {
            instream = bufHttpEntity.getContent();
        } catch (IOException e) {
            e.printStackTrace();
        }

        bitmap = BitmapFactory.decodeStream(instream);
    }
    return bitmap;
}
...