[英]How to download image from a Url?
我使用以下代码:
private class AsyncGetCatalogs extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
try {
Map<String, String> catalogsBuffer = Requester.getCatalog();
catalogsNumber = catalogsBuffer.size();
catalogs = new catalogInfo[catalogsNumber];
int n = 0;
for(Map.Entry<String, String> entry : catalogsBuffer.entrySet()) {
catalogs[n] = new catalogInfo();
String name = entry.getKey();
String link = entry.getValue();
String imageLink = Requester.getCatalogImageLink(name);
byte imgBuf[] = Requester.getCatalogImage(imageLink);
Bitmap bitmap = BitmapFactory.decodeByteArray(imgBuf, 0, imgBuf.length);
catalogs[n].setBitmap(bitmap);
catalogs[n].setCatLink(link);
catalogs[n].setCatName(name);
n++;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
try {
LinearLayout catsLayouts[] = new LinearLayout[catalogsNumber];
for(int i=0;i<catalogsNumber;i++) {
catsLayouts[i] = new LinearLayout(getApplicationContext());
ImageView catImageView = new ImageView(getApplicationContext());
catImageView.setImageBitmap(catalogs[i].getImage());
catsLayouts[i].addView(catImageView);
mainLayout.addView(catsLayouts[i]);
}
} catch(Exception e) {
e.printStackTrace();
}
}
}
应用程序在以下位置崩溃:
byte imgBuf[] = Requester.getCatalogImage(imageLink);
具有这样的堆栈跟踪;
01-25 00:22:26.998: E/AndroidRuntime(975): FATAL EXCEPTION: AsyncTask #2
01-25 00:22:26.998: E/AndroidRuntime(975): java.lang.RuntimeException: An error occured while executing doInBackground()
01-25 00:22:26.998: E/AndroidRuntime(975): at android.os.AsyncTask$3.done(AsyncTask.java:278)
01-25 00:22:26.998: E/AndroidRuntime(975): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
01-25 00:22:26.998: E/AndroidRuntime(975): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
01-25 00:22:26.998: E/AndroidRuntime(975): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
01-25 00:22:26.998: E/AndroidRuntime(975): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
01-25 00:22:26.998: E/AndroidRuntime(975): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
01-25 00:22:26.998: E/AndroidRuntime(975): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
01-25 00:22:26.998: E/AndroidRuntime(975): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
01-25 00:22:26.998: E/AndroidRuntime(975): at java.lang.Thread.run(Thread.java:856)
01-25 00:22:26.998: E/AndroidRuntime(975): Caused by: java.lang.NoClassDefFoundError: javax.imageio.ImageIO
01-25 00:22:26.998: E/AndroidRuntime(975): at IrkroseRequester.IrkroseRequester.getCatalogImage(IrkroseRequester.java:152)
01-25 00:22:26.998: E/AndroidRuntime(975): at com.example.client.MainContentActivity$AsyncGetCatalogs.doInBackground(MainContentActivity.java:79)
01-25 00:22:26.998: E/AndroidRuntime(975): at com.example.client.MainContentActivity$AsyncGetCatalogs.doInBackground(MainContentActivity.java:1)
01-25 00:22:26.998: E/AndroidRuntime(975): at android.os.AsyncTask$2.call(AsyncTask.java:264)
01-25 00:22:26.998: E/AndroidRuntime(975): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
** getCatalog图片**
public byte[] getCatalogImage(String _link) throws IOException {
String link = "http://irkrose.ru/images/catalogImages/"+_link;
URL url = new URL(_link);
BufferedImage img = ImageIO.read(url);
ByteArrayOutputStream res = new ByteArrayOutputStream();
ImageIO.write(img, "jpg", res);
return res.toByteArray();
}
据我了解,找不到ImageIO。 我知道android还没有,但是所有使用ImageIO的功能都在另一个以lib形式添加到应用程序的java包中。 而android app仅适用于字节数组。
那怎么了? 以及如何从URL加载.jpg图像? 异步类有问题吗?
尝试这个:
private class GetImageTaskextends AsyncTask<String, Void, Bitmap> {
ImageView tempBitmapImage;
public GetImageTask(ImageView tempBitmapImage) {
this.tempBitmapImage = tempBitmapImage;
}
protected Bitmap doInBackground(String... urls) {
String urldisplay = urls[0];
Bitmap mIcon11 = null;
try {
InputStream in = new java.net.URL(urldisplay).openStream();
mIcon11 = BitmapFactory.decodeStream(in);
} catch (Exception e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
return mIcon11;
}
protected void onPostExecute(Bitmap result) {
tempBitmapImage.setImageBitmap(result);
}
}
并像这样使用它:
new GetImageTask((ImageView) imgIcon).execute("www.test.com/test.jpg");
希望对您有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.