如何从普通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);