我使用这段代码:
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)
** 获取目录图像 **
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 的函数都在另一个 java 包中,只是作为 lib 添加到应用程序中。android 应用程序仅适用于字节数组。
那么有什么问题呢?以及如何以另一种方式从 url 加载 .jpg 图像?异步类会不会有问题?