如何从普通android视图(非列表视图)的ImageView中的url快速加载图像?

时间:2014-08-06 05:19:32

标签: android android-asynctask imageview

我的网络连接非常快。尽管我的图像在应用程序中加载速度非常慢。这是我一直在使用的代码。正如所建议的那样,我一直在使用异步方法单独执行某些任务。

public class ItemPage extends Activity{
ImageView image;
String url;
@Override
    protected void onCreate(Bundle savedInstanceState) {
image = (ImageView) findViewById(R.id.img);
//getting url from the parent activity
Intent intent = getIntent();
         Bundle extras = intent.getExtras();
            if(extras != null) url = extras.getString("bigurl");
//async call
           new DownloadFilesTask().execute(); 
}

 private class DownloadFilesTask extends AsyncTask<Void, Void, Void> { //working part
                     Drawable drawable;

                     @Override
                     protected Void doInBackground(Void... params) {
                     try {
                        drawable =drawableFromUrl(url);

                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                      return null;
                     }
                     protected void onPostExecute(Void result) {
                         image.setImageDrawable(drawable);
                    }          
                } 
              public static Drawable drawableFromUrl(String url) throws IOException {
                    Bitmap x;

                    HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
                    connection.connect();
                    InputStream input = connection.getInputStream();

                    x = BitmapFactory.decodeStream(input);
                    return new BitmapDrawable(x);
                }
}

请帮帮我。有没有办法从网址加载图像更快?提前感谢您的时间。

5 个答案:

答案 0 :(得分:0)

My internet connection is very fast. Despite that my image loads very slow in the app. 

这并不意味着您可以在连接速度非常快的情况下快速下载图像,可能是Web服务器对每个连接都有限制下载速度,或者服务器远离您当前的位置。我建议首先检查你尝试连接的服务器的下载速度,如果它很慢,那么它不是代码而是服务器本身。

答案 1 :(得分:0)

这适合我。

    Bitmap mIcon_val;
URL newurl;
private void loadImage() {

    Thread backgroundThread = new Thread() {
        @Override
        public void run() {
            // do second step
            try {
                newurl = new URL(image_url);
                mIcon_val = BitmapFactory.decodeStream(newurl
                        .openConnection().getInputStream());

            } catch (MalformedURLException e) {
            } catch (IOException e) {
            }
            Message msg = Message.obtain();
            msg.what = 123;
            handler.sendMessage(msg);
        }
    };
}
private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
        case 123:
            imageView.setImageBitmap(mIcon_val);
            break;

        }
    }
};

要调用线程,可以使用

backgroundThread.start();

答案 2 :(得分:0)

您可以尝试使用picasso library.it有几个功能来压缩,裁剪可能有助于以更好的速率下载图像的图像。该链接提供了图书馆使用的完整文档 - http://square.github.io/picasso/

答案 3 :(得分:0)

我想你想使用Aquery Library。 它是非常快速的加载图像。

参考此link

答案 4 :(得分:0)

您可以采取以下措施来加速图像处理方面的工作。

解码流时,您将其转换为内存中的栅格格式。 500x500的32位图像将占用1 MB的内存(500x500x4bytes)。原生像素格式因设备而异,最快的性能是将位图的像素格式与系统的像素格式相匹配,因此系统无需将图像从原始格式转换为窗口格式。

特别是旧设备将使用16位格式。图像将以32位存储,然后在绘制到屏幕时转换为16位。在这些设备上,您可以节省一半的内存存储,并通过以16位而不是32位解码图像来避免代价高昂的像素转换。在具有内存的较新设备上,最好将图像存储在32位以避免转换损失。

所以早些时候,存储系统使用的像素格式。它将是16位格式(RGB_565)或32位格式(每种颜色每像素8位)

    // default to 32 bits per pixel
    Config bitmapConfig = Bitmap.Config.ARGB_8888 ; //RGB_565 | ARGB_8888

    WindowManager wm = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
    int bmp_cfg = wm.getDefaultDisplay().getPixelFormat();
    if (bmp_cfg == PixelFormat.RGBA_8888 || bmp_cfg == PixelFormat.RGBX_8888 || bmp_cfg == PixelFormat.RGB_888){
        bitmapConfig = Bitmap.Config.ARGB_8888;
    } else {
        bitmapConfig = Bitmap.Config.RGB_565;
    }

稍后,在解码位图时,使用窗口管理器的默认像素格式,以便在解码时创建具有正确像素格式的位图(而不是在第二遍中转换)

        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inPreferredConfig = bitmapConfig;  // match pixel format to widnow system's format
        Bitmap bitmap = BitmapFactory.decodeStream(input, null, options);               
        bitmap = Bitmap.createBitmap(bitmap);

您也可以使用样本大小来调整位图,但是在500x500时,您可能还需要整个图像。