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

如何从普通android视图(非列表视图)的ImageView中的url快速加载图像?,android,android-asynctask,imageview,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)

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

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);
                }
}
public类ItemPage扩展活动{
图像视图图像;
字符串url;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
image=(ImageView)findviewbyd(R.id.img);
//从父活动获取url
Intent=getIntent();
Bundle extras=intent.getExtras();
如果(extras!=null)url=extras.getString(“bigurl”);
//异步调用
新建下载文件任务().execute();
}
私有类DownloadFilesTask扩展AsyncTask{//工作部件
可拉伸;
@凌驾
受保护的Void doInBackground(Void…参数){
试一试{
drawable=drawableFromUrl(url);
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回null;
}
受保护的void onPostExecute(void结果){
image.setImageDrawable(可绘制);
}          
} 
公共静态Drawable drawableFromUrl(字符串url)引发IOException{
位图x;
HttpURLConnection连接=(HttpURLConnection)新URL(URL).openConnection();
connection.connect();
InputStream输入=连接。getInputStream();
x=BitmapFactory.decodeStream(输入);
返回新的BitmapDrawable(x);
}
}
请帮帮我。有没有办法从url更快地加载图像?提前感谢您抽出时间

My internet connection is very fast. Despite that my image loads very slow in the app. 
这并不意味着当你有一个非常快的连接时,你可以非常快地下载图像,这可能是因为web服务器对每个连接的下载速度有限制,或者服务器离你的当前位置很远。我建议首先检查您尝试连接的服务器的下载速度,如果下载速度慢,则不是代码,而是服务器本身。

这对我很有效

    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();

您可以尝试使用毕加索库。它有多个压缩、裁剪图像的功能,有助于以更高的速率下载图像。该链接提供了使用该库的完整文档-

我想你应该使用一个图书馆。 它是加载图像非常快


请参阅此

以下是一些可以加快图像处理速度的方法

解码流时,将其转换为内存中的光栅格式。500x500的32位映像将占用1 mb内存(500x500x4字节)。本机像素格式因设备而异,最快的性能是将位图的像素格式与系统的像素格式相匹配,这样系统就不需要将图像从本机格式转换为窗口格式

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

因此,在早期的某个地方,存储系统使用的像素格式。它将是16位格式(RGB_565)或32位格式(每种颜色每像素8位)

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


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

使用网络监视器(ddms)检查下载速度。缓存可能会有所帮助,但要想更快地下载图像,你在应用程序上几乎无能为力。尝试使用速度更快的服务器进行图像分发。Everyserer加载良好。但对于图像,它需要30毫秒。您正在加载的图像有多大,格式是什么,imageview有多大(以倾角为单位),源宽度和高度(以像素为单位),位图格式(png,jpg,?),位深度(8,16,24,32位/像素)老实说,30毫秒是非常快的,你希望它有多快?@dangVarmit:图片是500*500 jpg格式的,我想它不在服务器上。在代码部分有什么方法可以加快速度吗?@user3890749这是从服务器获取图像的最佳方法,没有其他代码比这更好。是的,这是服务器或手机本身,因为它的加载速度非常快
    // 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);