我使用AsyncTask从sever下载图像,但当调用 downloadImage()
从业 onCreate()
活动冻结,直到AsyncTask完成下载图片。
我正在使用这段代码。
Bitmap downloadImage() {
ImageDownloader task = new ImageDownloader();
Bitmap myImage;
try {
myImage = task.execute("https://drive.google.com/uc?id=0B51TujFYa0RBUUYzSE15WHZRR3c").get();
downloadedImg.setImageBitmap(myImage);
} catch (Exception e) {
e.printStackTrace();
}
Log.i("Interaction", "Button Tapped");
return myImage
}
public class ImageDownloader extends AsyncTask<String, Void, Bitmap> {
@Override
protected Bitmap doInBackground(String... urls) {
try {
URL url = new URL(urls[0]);
HttpURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.connect();
InputStream inputStream = connection.getInputStream();
//to convert Image from string data to bitmap
Bitmap myBitmap = BitmapFactory.decodeStream(inputStream);
return myBitmap;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
你没有正确使用 AysncTask 类。通过调用 get()
,你暂停你的主线,直到图片下载完毕。这就是为什么UI感觉很慢。
相反,你应该将图片从任务的 onPostExecute
方法。
private Toolbar toolbar;
private ImageView downloadedImg;
@Override
protected void onCreate(Bundle savedInstanceState) {
// ... omitted ...
ImageDownloader task = new ImageDownloader();
task.execute("https://drive.google.com/uc?id=0B51TujFYa0RBUUYzSE15WHZRR3c");
}
// ... omitted ...
public class ImageDownloader extends AsyncTask<String, Void, Bitmap> {
@Override
protected Bitmap doInBackground(String... urls) {
try {
URL url = new URL(urls[0]);
HttpURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.connect();
InputStream inputStream = connection.getInputStream();
//to convert Image from string data to bitmap
Bitmap myBitmap = BitmapFactory.decodeStream(inputStream);
return myBitmap;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
protected void onPostExecute(Bitmap result) {
downloadedImg.setImageBitmap(result);
}
}
你必须异步进行,而不是在主活动中进行,否则页面会被阻止,直到下载完成。有很多选项可以做到这一点。我认为最好的方法是在这个问题的公认答案中指出的。
如果你查看async任务的文档,你会发现 get()
有以下描述
必要时等待计算完成,然后检索结果。
而不是调用 get()
你应该实施 onPostExecute 的AsyncTask子类中,并在那里处理你的图像。在android开发者页面上甚至有一个例子。
public class ImageDownloader extends AsyncTask<String, Void, Bitmap> {
<...>
@Override
protected void onPostExecute(Bitmap result) {
downloadedImg.setImageBitmap(result);
}
}